Класс CarsController
Класс
CarsController
является центральной точкой приложения
AutoLot.Mvc
, обладая возможностями создания, чтения, обновления и удаления. В этой версии
CarsController
напрямую используется уровень доступа к данным. Позже в главе вы создадите еще одну версию
CarsController
, в которой для доступа к данным будет применяться служба
AutoLot.Api
.
Приведите операторы
using
в классе
CarsController
к следующему виду:
using AutoLot.Dal.Repos.Interfaces;
using AutoLot.Models.Entities;
using AutoLot.Services.Logging;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
Ранее вы добавили класс контроллера с маршрутом. Теперь наступило время добавить экземпляры реализаций
ICarRepo
и
IAppLogging<CarsController>
через внедрение зависимостей. Добавьте две переменные уровня класса для хранения этих экземпляров, а также конструктор, который будет внедрять оба экземпляра:
private readonly ICarRepo _repo;
private readonly IAppLogging<CarsController> _logging;
public CarsController(ICarRepo repo, IAppLogging<CarsController> logging)
{
_repo = repo;
_logging = logging;
}
Частичное представление списка автомобилей
Списковые представления (одно для целого реестра автомобилей и одно для списка автомобилей по производителям) совместно используют частичное представление. Создайте в каталоге
Views\Cars
новый каталог по имени
Partials
и добавьте в него файл представления
_CarListPartial.cshtml
, очистив его содержимое. Установите
IEnumerable<Car>
в качестве типа (его ненужно указывать полностью, поскольку в файл
_ViewImports.cshtml
добавлено пространство имен
AutoLot.Models.Entities
):
@model IEnumerable< Car>
Далее добавьте блок кода Razor с набором булевских переменных, которые указывают, должны ли отображаться производители. Когда частичное представление
CarListPartial.cshtml
применяется полным реестром автомобилей, производители будут показаны, а когда отображаются автомобили только одного производителя, то поле
Make
должно быть скрыто:
@{
var showMake = true;
if (bool.TryParse(ViewBag.ByMake?.ToString(), out bool byMake))
{
showMake = !byMake;
}
}
В следующей разметке
ItemCreateTagHelper
используется для создания ссылки на метод
Create()
типа
HttpGet
. В случае применения специальных вспомогательных функций дескрипторов имя указывается с использованием "шашлычного" стиля в нижнем регистре, т.е. суффикс
TagHelper
отбрасывается, а каждое слово в стиле Pascal приводится к нижнему регистру и отделяется символом переноса (что похоже на шашлык):
<p>
<item-create></item-create>
</p>
Для настройки таблицы и ее заголовков применяется вспомогательная функция HTML, посредством которой получаются значения
DisplayName
, связанные с каждым свойством. Для
DisplayName
будет выбираться значение атрибута
Display
или
DisplayName
, и если он не установлен, то будет использоваться имя свойства. В следующем разделе применяется блок кода Razor для отображения информации о производителе на основе ранее установленной переменной уровня представления:
<table class="table">
<thead>
<tr>
@if (showMake)
{
<th>
@Html.DisplayNameFor(model => model.MakeId)
</th>
}
<th>
@Html.DisplayNameFor(model => model.Color)
</th>
<th>
@Html.DisplayNameFor(model => model.PetName)
</th>
<th></th>
</tr>
</thead>
В последнем разделе производится проход по записям и их отображение с использованием вспомогательной функции HTML по имени
DisplayFor()
. Эта вспомогательная функция HTML ищет шаблон отображения с именем, соответствующим типу свойства, и если шаблон не обнаруживается, то разметка создается стандартным образом. Для каждого свойства объекта также выполняется поиск шаблона отображения, который применяется при его наличии. Например, если
Car
имеет свойство
DateTime
, то для него будет использоваться показанный ранее в главе шаблон
DisplayTemplate
.
В следующем блоке также задействованы специальные вспомогательные функции дескрипторов
item-edit
,
item-details
и
item-delete
, которые были добавлены ранее. Обратите внимание, что при передаче значений открытому свойству специальной вспомогательной функции имя свойства указывается с применением "шашлычного" стиля в нижнем регистре и добавляется к дескриптору в виде атрибута: