Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 627 628 629 630 631 632 633 634 635 ... 642

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);

}

Атрибут HttpPost помечает метод как конечную точку приложения для маршрута Cars/Create, когда запросом является POST. Атрибут ValidateAntiForgeryToken, использует значение скрытого элемента ввода для  __RequestVerificationToken чтобы сократить количество атак на сайт.

Экземпляр реализации IMakeRepo внедряется в метод из контейнера DI. Поскольку внедрение осуществляется в метод, применяется атрибут FromServices. Как вы наверняка помните, атрибут FromServices сообщает механизму привязки о том, чтобы он не пытался привязывать этот тип, и позволяет контейнеру DI узнать о необходимости создания экземпляра класса.

Сущность Car неявно привязывается к данным входящего запроса. Если состояние модели (ModelState) допустимо, тогда сущность Car добавляется в базу данных и пользователь перенаправляется на метод действия Details() с использованием вновь созданного идентификатора Car в качестве параметра маршрута. Такой шаблон называется "отправка-перенаправление-получение" (Post-Redirect-Get). Пользователь выполняет отправку с помощью метода HttpPost(Create()) и затем перенаправляется на метод HttpGet(Details()), что предотвращает повторную отправку браузером запроса POST, если пользователь решит обновить страницу.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Если состояние модели не является допустимым, то список SelectList с записями Make добавляется в объект ViewData и сущность, которая была отправлена, посылается обратно представлению Create. Состояние модели тоже неявно отправляется представлению, так что могут быть отображены любые ошибки.

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

Создайте в каталоге ViewsCars новый файл представления по имени Edit.cshtml. Удалите весь сгенерированный код и добавьте следующую разметку:

@model Car

@{

    ViewData["Title"] = "Edit";

}

<h1>Edit @Model.PetName</h1>

<hr />

<div class="row">

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

    <form asp-area="" asp-controller="Cars" asp-action="Edit"

      asp-route-id="@Model.Id">

      @Html.EditorForModel()

<b>      &lt;input type=&quot;hidden&quot; asp-for=&quot;Id&quot; /&gt;</b>

<b>      &lt;input type=&quot;hidden&quot; asp-for=&quot;TimeStamp&quot; /&gt;</b>

      &lt;div class=&quot;form-group&quot;&gt;

   &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;

            Save &lt;i class=&quot;fas fa-save&quot;&gt;&lt;/i&gt;

        &lt;/button&gt;&nbsp;&nbsp;|&nbsp;&nbsp;

        &lt;item-list&gt;&lt;/item-list&gt;

      &lt;/div&gt;

    &lt;/form&gt;

  &lt;/div&gt;

&lt;/div&gt;

@section Scripts {

    &lt;partial name=&quot;_ValidationScriptsPartial&quot; /&gt;

}

В представлении также применяется вспомогательная функция @Html.EditorForModel() и частичное представление _ValidationScriptsPartial. Однако оно еще содержит два скрытых элемента ввода для Id и TimeStamp. Они будут отправляться вместе с остальными данными формы, но не должны редактироваться пользователями. Без значений Id и TimeStamp не удалось бы сохранять изменения.

1 ... 627 628 629 630 631 632 633 634 635 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий