Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Наконец, в версии 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
будет раскрыта вместе со вспомогательными функциями дескрипторов.

На заметку! А для чего служит ведущий символ подчеркивания в

_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
(неизвестно). В противном случае шаблон отображает дату в сокращенном формате, используя свойство
Value
допускающего
null
типа или саму модель.

Шаблон отображения Car

Создайте внутри каталога

Views
новый каталог по имени
Cars
, а внутри него — каталог под названием
DisplayTemplates
. Добавьте в каталог
DisplayTemplates
новое представление по имени
Car.cshtml
. Удалите сгенерированный код вместе с комментариями и замените его показанным ниже кодом, который отображает сущность
Car
:

@model AutoLot.Models.Entities.Car

<dl class="row">

<dt class="col-sm-2">

@Html.DisplayNameFor(model => model.MakeId)

</dt>

<dd class="col-sm-10">

@Html.DisplayFor(model => model.MakeNavigation.Name)

</dd>

<dt class="col-sm-2">

@Html.DisplayNameFor(model => model.Color)

</dt>

<dd class="col-sm-10">

@Html.DisplayFor(model => model.Color)

</dd>

<dt class="col-sm-2">

@Html.DisplayNameFor(model => model.PetName)

</dt>

<dd class="col-sm-10">

@Html.DisplayFor(model => model.PetName)

</dd>

</dl>

Вспомогательная функция HTML под названием

DisplayNameFor
отображает имя свойства, если только свойство не декорировано или атрибутом
Display(Name="")
, или атрибутом
DisplayName("")
, и тогда применяется отображаемое значение. Метод
DisplayFor
отображает значение для свойства модели, указанное в выражении. Обратите внимание, что для получения названия производителя используется навигационное свойство
MakeNavigation
.

Поделиться с друзьями: