Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
В предыдущей теме мы посмотрели, как с помощью шаблонных хелперов отображать значения модели. Теперь же займемся логикой редактирования данных. Вначале добавим в контроллер действие, которые будет получать по Id объект модели и выводить в представление ее свойства для редактирования:
[HttpGet] public ActionResult EditBook(int? id) { if (id == null) { return HttpNotFound(); } Book book = db.Books.Find(id); if (book != null) { return View(book); } return HttpNotFound(); }
На случай, если пользователи не укажут id, мы устанавливаем в качестве параметра не int, а int?. И если такой параметр не передан, то возвращаем результат метода HttpNotFound
.
А представление у нас будет содержать набор хелперов EditorFor для некоторых полей модели:
@{ ViewBag.Title = "Редактировать книгу"; Layout = "~/Views/Shared/_Layout.cshtml"; } @model BookStore.Models.Book <h2>Книга № @Model.Id</h2> @using (Html.BeginForm("EditBook", "Home", FormMethod.Post)) { <fieldset> @Html.HiddenFor(m => m.Id) <p> @Html.LabelFor(m => m.Name, "Название книги") <br /> @Html.EditorFor(m => m.Name) </p> <p> @Html.LabelFor(m => m.Author, "Автор") <br /> @Html.EditorFor(m => m.Author) </p> <p> @Html.LabelFor(m => m.Price, "Цена") <br /> @Html.EditorFor(m => m.Price) </p> <p><input type="submit" value="Отправить" /></p> </fieldset> }
Так как уникальный идентификатор id книги нам не надо редактировать, то поле для его отображения сделаем скрытым, то есть воспользуемся
хелпером Html.HiddenFor
.
Теперь нам нужен сам код сохранения. Определим в контроллере действие EditBook, которое будет обрабатывать POST-запросы:
[HttpPost] public ActionResult EditBook(Book book) { db.Entry(book).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); }
С помощью строки db.Entry(book).State = EntityState.Modified;
мы указываем, что объект book
уже существует в базе данных,
и для него надо внести в базу измененное значение, а не создавать новую запись. После чего перенаправляемся на главную страницу.
Стоит отметить, что хотя Entity Framework позволяет нам абстрагироваться от запросов sql и структуры бд, но на низком уровне, когда мы устанавливаем
значение db.Entry(book).State = EntityState.Modified;
, то мы тем самым указываем методу db.SaveChanges()
, что надо
сгенерировать и выполнить комаду UPDATE для обновления данных в БД.
Обратимся к методу EditBook, например, Home/EditBook/1
:
Хелпер Html.EditorFor
сгенерировал нам поля для редактирования. Мы можем изменить объект модели, и отправить его на сервер, где произойдет ее сохранение.