Методы действий Edit()
В рамках процесса редактирования используются два метода действий: первый (
HttpGet
) возвращает сущность, подлежащую редактированию, а второй (
HttpPut
) отправляет значения обновленной записи.
Метод действия Edit() для GET
Метод действия
Edit()
для
GET
получает одиночную запись
Car
с идентификатором
Id
через оболочку службы и отправляет ее представлению
Edit
:
[HttpGet("{id?}")]
public IActionResult Edit([FromServices] IMakeRepo makeRepo, int? id)
{
var car = GetOneCar(id);
if (car == null)
{
return NoContent();
}
ViewData["MakeId"] = GetMakes(makeRepo);
return View(car);
}
Маршрут имеет необязательный параметр
id
, значение которого передается методу с применением параметра
id
. Экземпляр реализации
IMakeRepo
внедряется в метод и используется для создания списка
SelectList
записей
Make
. Посредством вспомогательного метода
GetOneCar()
получается запись
Car
. Если запись
Car
найти не удалось, тогда метод возвращает ошибку
NoContent
. В противном случае он добавляет список
SelectList
записей
Make
в словарь
ViewData
и визуализирует представление
Edit
.
Форму редактирования можно просмотреть по ссылке
/Cars/Edit/1
(рис. 31.8).
Метод действия Edit() для POST
Метод действия
Edit()
для
POST
аналогичен методу действия
Create()
для
POST
с отличиями, описанными после кода метода:
[HttpPost("{id}")]
[ValidateAntiForgeryToken]
public IActionResult Edit([FromServices] IMakeRepo makeRepo, int id, Car car)
{
if (id != car.Id)
{
return BadRequest();
}
if (ModelState.IsValid)
{
_repo.Update(car);
return RedirectToAction(nameof(Details),new {id = car.Id});
}
ViewData["MakeId"] = GetMakes(makeRepo);
return View(car);
}
Метод действия
Edit()
для
POST
принимает один обязательный параметр маршрута
id
. Если его значение не совпадает со значением
Id
реконструированной сущности
Car
, тогда клиенту отправляется ошибка
BadRequest
. Если состояние модели допустимо, то сущность обновляется, после чего пользователь перенаправляется на метод действия
Details()
с применением свойства
Id
сущности
Car
в качестве параметра маршрута. Здесь также используется шаблон "отправка-перенаправление-получение".
Если состояние модели не является допустимым, то список
SelectList
с записями
Make
добавляется в объект
ViewData
и сущность, которая была отправлена, посылается обратно представлению
Edit
. Состояние модели тоже неявно отправляется представлению, так что могут быть отображены любые ошибки.
Представление Delete
Создайте в каталоге
ViewsCars
новый файл представления по имени
Delete.cshtml
. Удалите весь сгенерированный код и добавьте следующую разметку:
@model Car
@{
ViewData["Title"] = "Delete";
}
<h1>Delete @Model.PetName</h1>
<h3>Are you sure you want to delete this car?</h3>
<div>
@Html.DisplayForModel()
<form asp-action="Delete">
<b> <input type="hidden" asp-for="Id" /></b>
<b> <input type="hidden" asp-for="TimeStamp" /></b>
<button type="submit" class="btn btn-danger">
Delete <i class="fas fa-trash"></i>
</button> |
<item-list></item-list>
</form>
</div>
В представлении
Delete
тоже применяется вспомогательная функция
@Html.DisplayForModel()
и два скрытых элемента ввода для
Id
и
TimeStamp
. Это единственные поля, которые отправляются в виде данных формы.