Литмир - Электронная Библиотека
A
A

Класс 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
, которые были добавлены ранее. Обратите внимание, что при передаче значений открытому свойству специальной вспомогательной функции имя свойства указывается с применением "шашлычного" стиля в нижнем регистре и добавляется к дескриптору в виде атрибута:

628
{"b":"847442","o":1}