Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

<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.

Представление Create

Представление

Create
было начато ранее. Вот его полная разметка:

@model Car

@{

ViewData["Title"] = "Create";

}

<h1>Create a New Car</h1>

<hr/>

<div class="row">

<div class="col-md-4">

<form asp-controller="Cars" asp-action="Create">

<div asp-validation-summary="ModelOnly" class="text-danger"></div>

@Html.EditorForModel

<div class="form-group">

<button type="submit"

class="btn btn-success">Create <i class="fas fa-
plus"></i>

</button>&nbsp;&nbsp;|&nbsp;&nbsp;

<item-list></item-list>

</div>

</form>

</div>

</div>

@section Scripts {

<partial name="_ValidationScriptsPartial" />

}

Вспомогательная

функция
@Html.EditorForModel
использует созданный ранее шаблон отображения (
Car.cshtml
) для отображения редактора сведений об автомобиле.

В разделе

Scripts
представления указано частичное представление
_ValidationScriptsPartial
. Вспомните, что в компоновке этот раздел встречается после загрузки jQuery. Шаблон разделов помогает гарантировать загрузку надлежащих зависимостей до загрузки самого содержимого.

Методы действий Create

В рамках процесса создания применяются два метода действий: первый (

HttpGet
) возвращает пустое представление для ввода новой записи, а второй (
HttpPut
) отправляет значения новой записи.

Вспомогательный метод GetMakes

Вспомогательный метод

GetMakes
возвращает список записей
Make
в виде экземпляра
SelectList
и принимает в качестве параметра экземпляр реализации
IMakeRepo
:

internal SelectList GetMakes(IMakeRepo makeRepo)

=> new SelectList(makeRepo.GetAll, nameof(Make.Id), nameof(Make.Name));

Метод действия Create для GET

Метод действия

Create
для
GET
помещает в словарь
ViewData
список
SelectList
с записями
Make
и отправляет его представлению
Create
:

[HttpGet]

public IActionResult Create([FromServices] IMakeRepo makeRepo)

{

ViewData["MakeId"] = GetMakes(makeRepo);

return View;

}

Форму создания можно просмотреть по ссылке

/Cars/Create
(рис. 31.7).

Метод действия Create для POST

Метод действия

Create
для
POST
применяет неявную привязку модели для создания сущности
Car
из значений формы. Вот его код:

[HttpPost]

[ValidateAntiForgeryToken]

public IActionResult Create([FromServices] IMakeRepo makeRepo, Car car)

{

if (ModelState.IsValid)

{

_repo.Add(car);

return RedirectToAction(nameof(Details),new {id = car.Id});

}

ViewData["MakeId"] = GetMakes(makeRepo);

return View(car);

}

Поделиться с друзьями: