Я новичок в MVC, поэтому работаю над учебником NerdDinner здесь. В частности, у меня возникают проблемы с использованием метода UpdateModel, который объясняется в пятой части этого учебника. Проблема в том, что когда я пытаюсь изменить значение объекта ужина с помощью метода UpdateModel, значения не обновляются, и никаких исключений не возникает.
Как ни странно, у меня нет проблем с функциями Create или Delete, которые проиллюстрированы в учебнике. Только функция обновления не работает.
Ниже я включил код контроллера, который я использую, а также разметку представления, которая содержится как в файле aspx View, так и в файле с частичным представлением ascx.
Вот код внутри моего контроллера, называемый DinnerController.cs:
//
// GET: /Dinners/Edit/2
[Authorize]
public ActionResult Edit(int id)
{
Dinner dinner = dinnerRepository.GetDinner(id);
return View(new DinnerFormViewModel(dinner));
}
//
// POST: /Dinners/Edit/2
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}
строка с комментарием "поймать другие ошибки ModelState" была добавлена после прочтения возможного решения из другого потока StackOverflow:
ASP.NET MVC Updatemodel не обновляет, а не бросает ошибку
К сожалению, это решение мне не помогло.
Вот соответствующая разметка в моем представлении Dinners/Edit.aspx:
<asp:Content ID="Main" ContentPlaceHolderID="MainContent" runat="server">
<h2>Edit Dinner</h2>
<% Html.RenderPartial("DinnerForm"); %>
</asp:Content>
Вот соответствующая разметка в частичном представлении DinnerForm.ascx. Этот файл Partial View также используется функцией Create, которая отлично работает:
<%=Html.ValidationSummary("Please correct the errors and try again.") %>
<% using (Html.BeginForm()) { %>
<fieldset>
<p>
<label for="Title">Dinner Title:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Title)%>
<%=Html.ValidationMessage("Title", "*") %>
</p>
<p>
<label for="EventDate">EventDate:</label>
<%=Html.TextBoxFor(model => Model.Dinner.EventDate, new { value = String.Format("{0:g}", Model.Dinner.EventDate) })%>
<%=Html.ValidationMessage("EventDate", "*") %>
</p>
<p>
<label for="Description">Description:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Description)%>
<%=Html.ValidationMessage("Description", "*")%>
</p>
<p>
<label for="Address">Address:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Address)%>
<%=Html.ValidationMessage("Address", "*") %>
</p>
<p>
<label for="Country">Country:</label>
<%=Html.DropDownListFor(model => Model.Dinner.Country, Model.Countries)%>
<%=Html.ValidationMessage("Country", "*") %>
</p>
<p>
<label for="ContactPhone">ContactPhone #:</label>
<%=Html.TextBoxFor(model => Model.Dinner.ContactPhone)%>
<%=Html.ValidationMessage("ContactPhone", "*") %>
</p>
<p>
<label for="Latitude">Latitude:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Latitude)%>
<%=Html.ValidationMessage("Latitude", "*") %>
</p>
<p>
<label for="Longitude">Longitude:</label>
<%=Html.TextBoxFor(model => Model.Dinner.Longitude)%>
<%=Html.ValidationMessage("Longitude", "*") %>
</p>
<p>
<input type="submit" value="Save"/>
</p>
</fieldset>
<% } %>
В любом случае, я часами пробираюсь в это время, и у меня нет идей. Итак, я надеюсь, что кто-то здесь может помочь подтолкнуть меня в правильном направлении, чтобы понять, что я делаю неправильно.
У тебя что-то перепуталось. Вы отправляете DinnerFormViewModel для просмотра, но пытаетесь получить Ужин. Измените свой почтовый метод следующим образом:
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection formValues)
{
var dinner=new DinnerFormViewModel(dinnerRepository.GetDinner(id));
try
{
UpdateModel(dinner);
var x = ViewData.GetModelStateErrors(); // <-- to catch other ModelState errors
dinnerRepository.Save();
return RedirectToAction("Details", new { id = dinner.Dinner.DinnerID });
}
catch
{
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}
Здесь может быть что-то, что я пропустил, не помню DinnerFormViewModel прямо сейчас. Пожалуйста, проверьте эти
edit: На самом деле я понял, что этот пост не решает проблему на самом деле. Код, указанный в вопросе, работает для меня. Существует проблема, но не здесь.
dinnerRepository.Save()
- это код, который фактически обновляет базу данных. То, что UpdateModel(dinner)
делает, извлекает значения из коллекции форм и помещает их в ваш объект dinner
.
На всякий случай, это поможет кому-то еще в будущем, проблема здесь не обязательно связана с использованием DinnerFormViewModel, как я подозревал. Скорее, проблема заключалась в использовании сильно типизированных вспомогательных методов, таких как Html.TextBoxFor и способах, которыми я вызывал метод UpdateModel.
Эта проблема и ее решение подробно объясняются в другом потоке в StackOverflow, здесь.