Класс 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;
}
Частичное представление списка автомобилей
Списковые представления (одно для целого реестра автомобилей и одно для списка автомобилей по производителям) совместно используют частичное представление. Создайте в каталоге ViewsCars новый каталог по имени 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;
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
}
}
В следующей разметке 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, которые были добавлены ранее. Обратите внимание, что при передаче значений открытому свойству специальной вспомогательной функции имя свойства указывается с применением "шашлычного" стиля в нижнем регистре и добавляется к дескриптору в виде атрибута: