Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Шрифт:
Интервал:
Закладка:
Первым делом добавьте новое представление, щелкнув правой кнопкой мыши на имени каталога ViewsHome в проекте AutoLot.Mvc и выбрав в контекстном меню пункт Add►New Item (Добавить►Новый элемент). В открывшемся диалоговом окне Add New Item — AutoLot.Mvc (Добавить новый элемент — AutoLot.Mvc) выберите шаблон Razor View — Empty (Представление Razor — Пустое) и назначьте представлению имя RazorSyntax.cshtml.
На заметку! Контекстное меню, открывшееся в результате щелчка правой кнопкой мыши на ViewsHome, содержит также пункт Add►View (Добавить►Представление). Тем не менее, его выбор приводит к переходу в то же самое диалоговое окно Add New Item.
Представления Razor, как правило, строго типизированы с использованием директивы @model (обратите внимание на букву m в нижнем регистре). Измените тип нового представления на сущность Car, добавив в начало файла представления такой код:
@model AutoLot.Models.Entities.Car
Поместите в верхнюю часть страницы дескриптор <hl>. Он не имеет ничего общего с Razor, а просто добавляет заголовок к странице:
<h1>Razor Syntax</h1>
Блоки операторов Razor открываются с помощью символа @ и являются либо самостоятельными операторами (вроде foreach), либо заключаются в фигурные скобки, как демонстрируется в следующих примерах:
@for (var i = 0; i < 15; i++)
{
// Делать что-то.
}
@{
// Блок кода.
var foo = "Foo";
var bar = "Bar";
var htmlString = "<ul><li>one</li><li>two</li></ul>";
}
Чтобы вывести значение переменной в представление, просто укажите символ @ с именем переменной, что эквивалентно вызову Response.Write(). Как видите, при выводе напрямую в браузер после оператора нет точки с запятой:
@foo
<br />
@htmlString
<br />
@foo.@bar
<br />
В предыдущем примере две переменные комбинируются посредством точки между ними (@foo.@bar). Это не обычная "точечная" запись в языке С#, предназначенная для навигации по цепочке свойств. Здесь просто значения двух переменных выводятся в поток ответа с физической точкой между ними. Если вас интересует "точечная" запись в отношении переменной, тогда примените @ к переменной и записывайте свой код стандартным образом:
@foo.ToUpper()
Если вы хотите вывести низкоуровневую HTML-разметку, тогда используйте так называемые вспомогательные функции HTML (HTML helper), которые встроены в механизм визуализации Razor. Следующая строка выводит низкоуровневую HTML-разметку:
@Html.Raw(htmlString)
<hr />
В блоках кода можно смешивать разметку и код. Строки, начинающиеся с разметки, интерпретируются как HTML, а остальные строки — как код. Если строка начинается с текста, который не является кодом, вы должны применять указатель содержимого (@:) или указатель блока содержимого (<text></text>). Обратите внимание, что строки могут меняться с одного вида на другой и наоборот. Ниже приведен пример:
@{
@:Straight Text
<div>Value:@Model.Id</div>
<text>
Lines without HTML tag
</text>
<br />
}
При желании отменить символ @ используйте удвоенный @. Кроме того, механизм Razor достаточно интеллектуален, чтобы обрабатывать адреса электронной почты, поэтому отменять символ @ в них не нужно. Если необходимо заставить Razor трактовать символ @ подобно маркеру Razor, тогда добавьте круглые скобки:
<br />
@@foo
<br />
test@foo
<br/>
test@(foo)
<br />
Предыдущий код выводит [email protected], @foo, test@foo и testFoo.
Комментарии Razor открываются с помощью @* и закрываются посредством *@:
@*
Multiline Comments
Hi.
*@
В Razor также поддерживаются внутристрочные функции. Например, следующая функция сортирует список строк:
@functions {
public static IList<string> SortList(IList<string> strings) {
var list = from s in strings orderby s select s;
return list.ToList();
}
}
Приведенный далее код создает список строк, сортирует их с применением функции SortList() и выводит отсортированный список в браузер:
@{
var myList = new List<string> {"C", "A", "Z", "F"};
var sortedList = SortList(myList);
}
@foreach (string s in sortedList)
{
@s@:
}
<hr/>
Вот еще один пример, где создается делегат, который можно использовать, чтобы установить для строки полужирное начертание:
@{
Func<dynamic, object> b = @<strong>@item</strong>;
}
This will be bold: @b("Foo")
Кроме того, Razor содержит вспомогательные методы HTML, которые предоставляются инфраструктурой ASP.NET Core, например, DisplayForModel() и EditorForModel(). Первый применяет рефлексию к модели представления для отображения на веб-странице. Второй тоже использует рефлексию, чтобы создать HTML-разметку для формы редактирования (имейте в виду, что он не поставляет дескрипторы Form, а только разметку для модели). Вспомогательные методы HTML подробно рассматриваются позже в главе.
Наконец, в версии ASP.NET Core появились вспомогательные функции дескрипторов (tag helper), которые объединяют разметку и код; они будут обсуждаться далее в главе.
Представления
Представления — это специальные файлы кода с расширением cshtml, содержащие сочетание разметки HTML, стилей CSS, кода JavaScript и кода Razor.
Каталог Views
Внутри каталога Views хранятся представления в проектах ASP.NET Core, использующих паттерн MVC. В самом каталоге Views находятся два файла: _iewStart.cshtml и _ViewImports.cshtml.
Код в файле _ViewStart.cshtml выполняется перед визуализацией любого другого представления (за исключением частичных представлений и компоновок). Файл _ViewStart.cshtml обычно применяется с целью установки стандартной компоновки для представлений, в которых она не указана. Компоновки подробно рассматриваются в разделе "Компоновки" позже в главе. Вот как выглядит содержимое файла _ViewStart.cshtml:
@{
Layout = "_Layout";
}
Файл _ViewImports.cshtml служит для импортирования совместно используемых директив, таких как операторы using. Содержимое применяется ко всем представлениям в том же каталоге или подкаталоге, где находится файл _ViewImports. Добавьте оператор using для AutoLot.Models.Entities:
@using AutoLot.Mvc
@using AutoLot.Mvc.Models
@using AutoLot.Models.Entities
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Строка @addTegHelper будет раскрыта вместе со вспомогательными функциями дескрипторов.
На заметку! А для