ASP.NET MVC 4 — как использовать модель представления при редактировании и сохранении данных

mvc 4 с использованием sql server 2008, сначала код, ef5

У меня есть ViewModel, связанная с представлением.

В качестве отправной точки я модифицирую строительные леса, созданные VS.

Я могу заполнить форму нормально.

Когда пользователь нажимает сохранить — это код в скаффолдинге:

 [HttpPost]
 public ActionResult Edit(Place place)
 {
 if (ModelState.IsValid)
    {
       db.Entry(place).State = EntityState.Modified;
       db.SaveChanges();
       return RedirectToAction("Index");
    }
 return View(place);

Место является образцом. Мне нужно передать модель представления (включая место) обратно к этому.

Как сохранить модель представления в базе данных с помощью EF? Должен ли я сначала разделить его на модели?

Когда я пытаюсь это сделать, я получаю эту ошибку:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.

Когда я отлаживаю, также кажется, что PlaceID (из модели) отсутствует в модели, которая передается обратно контроллеру httpPost Edit controller - может быть, это источник ошибки?

Есть ли какие-либо примеры передовой практики в Интернете для этого - я ничего не могу найти.

Спасибо.


person niico    schedule 05.06.2013    source источник


Ответы (2)


Как сохранить модель представления в базе данных с помощью EF?

Вы не сохраняете модели представлений в базе данных. Их роль не должна быть сохранена. Модели представления используются для определения логики, используемой вашим представлением. Внутри действия контроллера вы можете сопоставить модель представления с моделью предметной области, которая будет сохраняться с использованием выбранной вами технологии доступа к данным. Вы можете использовать AutoMapper для сопоставления моделей представления и моделей предметной области.

Когда я отлаживаю, также кажется, что PlaceID (из модели) отсутствует в модели, которая передается обратно контроллеру httpPost Edit controller - может быть, это источник ошибки?

Да, это возможная причина. Если вы хотите обновить какую-либо запись в базе данных, EF необходимо знать, что это за запись, используя идентификатор.

person Darin Dimitrov    schedule 05.06.2013
comment
Он не был отправлен в запросе. - person Darin Dimitrov; 05.06.2013
comment
как бы я ответил на это? Будет ли он обычно отправляться автоматически при публикации формы? - person niico; 05.06.2013
comment
ах, мне нужно это: @Html.HiddenFor(model => model.place.PlaceID) - person niico; 05.06.2013

Это отсутствовало в представлении:

@Html.HiddenFor(модель => model.place.PlaceID)

Это отслеживает идентификатор модели.

person niico    schedule 05.06.2013
comment
вот как это делает скаффолдинг - хотя мне кажется очень небезопасным раскрывать имя поля идентификатора и значение! - person niico; 05.06.2013
comment
forums.asp.net/t/1798117.aspx/1 — это предполагает шифрование - мне кажется, что asp.net должен делать это автоматически - пустая трата времени... - person niico; 05.06.2013