@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. Запустив приложение и перейдя по ссылке <a href="https://localhost:5001/Cars/Details/1">https://localhost:5001/Cars/Details/1</a>, вы увидите экран, показанный на рис. 31.6.
Представление Create
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
Представление 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>
<b> @Html.EditorForModel()</b>
<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>
<b>@section Scripts {</b>
<b> <partial name="_ValidationScriptsPartial" /></b>
<b>}</b>
Вспомогательная функция @Html.EditorForModel() использует созданный ранее шаблон отображения (Car.cshtml) для отображения редактора сведений об автомобиле.
В разделе Scripts представления указано частичное представление _ValidationScriptsPartial. Вспомните, что в компоновке этот раздел встречается после загрузки jQuery. Шаблон разделов помогает гарантировать загрузку надлежащих зависимостей до загрузки самого содержимого.
Методы действий Create()
В рамках процесса создания применяются два метода действий: первый (HttpGet) возвращает пустое представление для ввода новой записи, а второй (HttpPut) отправляет значения новой записи.
Вспомогательный метод GetMakes()
Вспомогательный метод GetMakes() возвращает список записей Make в виде экземпляра SelectList и принимает в качестве параметра экземпляр реализации IMakeRepo: