В каталоге 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
(неизвестно). В противном случае шаблон отображает дату в сокращенном формате, используя свойство Value
допускающего null
типа или саму модель.
Шаблон отображения Car
Создайте внутри каталога Views
новый каталог по имени Cars
, а внутри него — каталог под названием DisplayTemplates
. Добавьте в каталог DisplayTemplates
новое представление по имени Car.cshtml
. Удалите сгенерированный код вместе с комментариями и замените его показанным ниже кодом, который отображает сущность Car
:
@model AutoLot.Models.Entities.Car
@Html.DisplayNameFor(model => model.MakeId)
@Html.DisplayFor(model => model.MakeNavigation.Name)
@Html.DisplayNameFor(model => model.Color)
@Html.DisplayFor(model => model.Color)
@Html.DisplayNameFor(model => model.PetName)
@Html.DisplayFor(model => model.PetName)
Вспомогательная функция HTML под названием DisplayNameFor()
отображает имя свойства, если только свойство не декорировано или атрибутом Display(Name="")
, или атрибутом DisplayName("")
, и тогда применяется отображаемое значение. Метод DisplayFor()
отображает значение для свойства модели, указанное в выражении. Обратите внимание, что для получения названия производителя используется навигационное свойство MakeNavigation
.
Запустив приложение и перейдя на страницу RazorSyntax
, вы можете быть удивлены тем, что шаблон отображения Car
не применяется. Причина в том, что шаблон находится в каталоге представления Cars
, а метод действия RazorSyntax
и представление вызываются из HomeController
. Методы действий в HomeController
будут осуществлять поиск представлений в каталогах Home
и Shared
и потому не найдут шаблон отображения Car
.
Если вы переместите файл Car.cshtml
в каталог Shared\DisplayTemplates
, тогда представление RazorSyntax
будет использовать шаблон отображения Car
.
Шаблон отображения CarWithColor
Шаблон CarWithColor
похож на шаблон Car
. Разница в том, что этот шаблон изменяет цвет текста Color (Цвет) на основе значения свойства Color
модели. Добавьте в каталог Cars\DisplayTemplates
новый шаблон по имени CarWithColors.cshtml
и приведите разметку к следующему виду:
@model Car
@Html.DisplayNameFor(model => model.PetName)
@Html.DisplayFor(model => model.PetName)
@Html.DisplayNameFor(model => model.MakeNavigation)
@Html.DisplayFor(model => model.MakeNavigation.Name)