Язык программирования 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> |
<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);
}
Поделиться с друзьями: