Редактирование данных

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

В предыдущей теме мы посмотрели, как с помощью шаблонных хелперов отображать значения модели. Теперь же займемся логикой редактирования данных. Вначале добавим в контроллер действие, которые будет получать по 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 сгенерировал нам поля для редактирования. Мы можем изменить объект модели, и отправить его на сервер, где произойдет ее сохранение.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850