Приведенный далее код создает список строк, сортирует их с применением функции
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), которые объединяют разметку и код; они будут обсуждаться далее в главе.
Представления
Представления — это специальные файлы кода с расширением
Внутри каталога Views хранятся представления в проектах ASP.NET Core, использующих паттерн MVC. В самом каталоге Views находятся два файла:
_iewStart.cshtml
и
_ViewImports.cshtml
.
Код в файле
_ViewStart.cshtml
выполняется перед визуализацией любого другого представления (за исключением частичных представлений и компоновок). Файл
_ViewStart.cshtml
обычно применяется с целью установки стандартной компоновки для представлений, в которых она не указана. Компоновки подробно рассматриваются в разделе "Компоновки" позже в главе. Вот как выглядит содержимое файла
_ViewStart.cshtml
:
@{
Layout = "_Layout";
}
Файл
_ViewImports.cshtml
служит для импортирования совместно используемых директив, таких как операторы
using
. Содержимое применяется ко всем представлениям в том же каталоге или подкаталоге, где находится файл
будет раскрыта вместе со вспомогательными функциями дескрипторов.
На заметку! А для чего служит ведущий символ подчеркивания в
_ViewStart.html
,
_ViewImports.cshtml
и
_Layout.cshtml
? Механизм визуализации Razor изначально создавался для платформы WebMatrix, где не разрешалось напрямую визуализировать файлы, имена которых начинались с символа
подчеркивания. Все ключевые файлы (вроде компоновки и конфигурации) имеют имена, начинающиеся с символа подчеркивания. Это не соглашение MVC, поскольку здесь отсутствует проблема, которая была в WebMatrix, но наследие символа подчеркивания продолжает существовать.
Как упоминалось ранее, каждый контроллер получает собственный каталог внутри каталога Views, в котором хранятся его специфичные представления. Имя такого каталога совпадает с именем контроллера (без суффикса
Controller
). Скажем, в каталоге
Views\Cars
содержатся все представления для
CarsController
. Представления обычно именуются согласно методам действий, которые их визуализируют, хотя их имена можно изменять, как уже было показано.
Каталог Shared
Внутри каталога
Views
есть специальный каталог по имени
Shared
, в котором хранятся представления, доступные всем контроллерам и действиям. Как уже упоминалось, если запрошенный файл представления не удалось найти в каталоге, специфичном для контроллера, тогда поиск производится в каталоге
Shared
.
Каталог DisplayTemplates
В каталоге
DisplayTemplates
хранятся специальные шаблоны, которые управляют визуализацией типов, а также содействуют многократному использованию кода и согласованности отображения. Когда вызываются методы
DisplayFor/DisplayForModel
, механизм визуализации Razor ищет шаблон, имя которого совпадает с именем визуализируемого типа, например,
Car.cshtml
для класса
Car
. Если специальный шаблон найти не удалось, тогда разметка визуализируется с применением рефлексии. Поиск начинается с каталога
Views\{CurrentControllerName}\DisplayTemplates
и в случае неудачи продолжается в каталоге
Views\Shared\DisplayTemplates
. Методы
DisplayFor/DisplayForModel
принимают необязательный параметр, указывающий имя шаблона.
Шаблон отображения DateTime
Создайте внутри каталога
Views\Shared
новый каталог под названием
DisplayTemplates
и добавьте в него новое представление по имени
DateTime.cshtml
. Удалите сгенерированный код вместе с комментариями и замените его следующим кодом:
@model DateTime?
@if (Model == null)
{
@:Unknown
}
else
{
if (ViewData.ModelMetadata.IsNullableValueType)
{
@:@(Model.Value.ToString("d"))
}
else
{
@:@(((DateTime)Model).ToString("d"))
}
}
Обратите внимание, что в директиве
@model
, строго типизирующей представление, используется буква m нижнего регистра. При ссылке на присвоенное значение модели в Razor применяется буква
М
верхнего регистра. В этом примере определение модели допускает значения
null
. Если переданное представлению значение для модели равно
null
, то шаблон отображает слово
Unknown
(неизвестно). В противном случае шаблон отображает дату в сокращенном формате, используя свойство