Язык программирования 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.
Поделиться:
Популярные книги
Зубных дел мастер
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Бывшие. Война в академии магии
2. Измены
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Идеальный мир для Лекаря 7
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга X
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Хозяин Теней
1. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Опасная любовь командора
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Друд, или Человек в черном
Фантастика:
социально-философская фантастика
6.80
рейтинг книги
Волхв
3. Волшебник
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Мастер Разума VII
7. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Всемирная энциклопедия афоризмов. Собрание мудрости всех народов и времен
Документальная литература:
публицистика
5.40
рейтинг книги
Сумеречный Стрелок 5
5. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Морской волк. 1-я Трилогия
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Прогрессор поневоле
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00