Язык программирования C#9 и платформа .NET5
Шрифт:
Представление Index
При наличии частичного представления
_CarListPartial
представление Index
будет небольшим. Создайте в каталоге Views\Cars
новый файл представления по имени Index.cshtml
. Удалите весь сгенерированный код и добавьте следующую разметку:
@model IEnumerable<Car>
@{
ViewData["Title"] = "Index";
}
<h1>Vehicle Inventory</h1>
<partial name="Partials/_CarListPartial" model="@Model"/>
Частичное
_CarListPartial
вызывается со значением модели содержащего представления (IEnumerable<Car>
), которое передается с помощью атрибута model
. В итоге модель частичного представления устанавливается в объект, переданный вспомогательной функции дескриптора <partial>
. Чтобы взглянуть на представление
Index
, модифицируйте метод Index
класса CarsController
, как показано ниже:
[Route("/[controller]")]
[Route("/[controller]/[action]")]
public IActionResult Index
=> View(_repo.GetAllIgnoreQueryFilters);
Запустив приложение и перейдя по ссылке
https://localhost:5001/Cars/Index
, вы увидите список автомобилей (рис. 31.4). В правой части списка отображаются специальные вспомогательные функции дескрипторов.
Представление ВуMake
Представление
ВуMake
похоже на Index
, но настраивает частичное представление так, что информация о производителе отображается только в заголовке страницы. Создайте в каталоге Views\Cars
новый файл представления по имени ВуMake.cshtml
. Удалите весь сгенерированный код и добавьте следующую разметку:
@model IEnumerable<Car>
@{
ViewData["Title"] = "Index";
}
<h1>Vehicle Inventory for @ViewBag.MakeName</h1>
@{
var mode = new ViewDataDictionary(ViewData) {{"ByMake", true}};
}
<partial name="Partials/_CarListPartial" model="Model" view-data="@mode"/>
Отличия заметить легко. Здесь создается экземпляр
ViewDataDictionary
, содержащий свойство ByMake
из ViewBag
, который затем вместе с моделью передается частичному представлению, что позволяет скрыть информацию о производителе. Метод действия для этого представления должен получить все автомобили с указанным значением MakeId
и установить ViewBag
в MakeName
с целью отображения в пользовательском интерфейсе. Оба значения берутся из маршрута. Добавьте в класс CarsController
новый метод действия по имени ByMake
:
[HttpGet("/[controller]/[action]/{makeId}/{makeName}")]
public IActionResult ByMake(int makeId, string makeName)
{
ViewBag.MakeName = makeName;
return View(_repo.GetAllBy(makeId));
}
Запустив приложение и перейдя по ссылке
https://localhost:5001/Cars/l/VW
, вы увидите список, показанный на рис. 31.5. Представление Details
Создайте в каталоге
Views\Cars
новый файл представления по имени Details.cshtml
. Удалите весь сгенерированный код и добавьте следующую разметку:
@model Car
@{
ViewData["Title"] = "Details";
}
<h1>Details for @Model.PetName</h1>
@Html.DisplayForModel
<div>
<item-edit item-id="@Model.Id"></item-edit>
<item-delete item-id="@Model.Id"></item-delete>
<item-list></item-list>
</div>
Вспомогательная функция
@Html.DisplayForModel
использует созданный ранее шаблон отображения (Car.cshtml
) для вывода детальной информации об автомобиле. Прежде чем обновлять метод действия
Details
, добавьте вспомогательный метод по имени GetOne
, который будет извлекать одиночную запись Car
:
internal Car GetOneCar(int? id) => !id.HasValue ? null : _repo.Find(id.Value);
Модифицируйте метод действия
Details
следующим образом:
[HttpGet("{id?}")]
public IActionResult Details(int? id)
{
if (!id.HasValue)
{
return BadRequest;
}
var car = GetOneCar(id);
if (car == null)
{
return NotFound;
}
return View(car);
}
Маршрут для метода действия
Details
содержит необязательный параметр маршрута id
с идентификатором автомобиля, значение которого присваивается параметру id
метода. Обратите внимание, что у параметра маршрута есть вопросительный знак с маркером. Это указывает на необязательность параметра, почти как вопросительный знак в типе int?
делает переменную int
допускающей значение null
. Если параметр не был предоставлен или оболочка службы не может отыскать автомобиль с идентификатором, заданным в параметре маршрута, тогда метод возвращает ошибку NotFound
. В противном случае метод отправляет найденную запись Car
представлению Details
. Запустив приложение и перейдя по ссылке https://localhost:5001/Cars/Details/1
, вы увидите экран, показанный на рис. 31.6.
Поделиться:
Популярные книги
Светлая ведьма для Темного ректора
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дайте поспать! Том II
2. Вечный Сон
Фантастика:
фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Последний попаданец 12: финал часть 2
12. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Истребители. Трилогия
Фантастика:
альтернативная история
7.30
рейтинг книги
Попаданка для Дракона, или Жена любой ценой
Любовные романы:
любовно-фантастические романы
7.17
рейтинг книги
Беглец. Второй пояс
8. Путь
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
5.67
рейтинг книги
Черный Маг Императора 4
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Боги, пиво и дурак. Том 3
3. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волк: лихие 90-е
1. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рота Его Величества
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
На изломе чувств
Любовные романы:
современные любовные романы
6.83
рейтинг книги
Дракон
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Кодекс Крови. Книга IV
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00