У меня возникают проблемы с привязкой к форме с несколькими представленными моделями. У меня есть форма жалобы, которая включает в себя информацию о жалобе, а также жалобы "один ко многим". Я пытаюсь отправить форму, но я получаю ошибки в привязке. ModelState.IsValid всегда возвращает false.
Если я отлаживаю и просматриваю ошибки ModelState, я получаю одно высказывание: "EntityCollection уже инициализирован. Метод InitializeRelatedCollection должен быть вызван только для инициализации нового EntityCollection во время десериализации графа объектов".
Кроме того, при отладке я вижу, что модель жалобы заполняется истцами из представления формы, поэтому кажется, что часть работает.
Я не уверен, что то, что я делаю, невозможно с помощью ModelBinder по умолчанию, или если я просто не буду делать это правильно. Я не могу найти конкретных примеров или документации по этому поводу. Очень похожую проблему можно найти в stackoverflow здесь, но, похоже, это не касается сильно типизированных представлений.
Код контроллера:
public ActionResult Edit(int id)
{
var complaint = (from c in _entities.ComplaintSet.Include("Complainants")
where c.Id == id
select c).FirstOrDefault();
return View(complaint);
}
//
// POST: /Home/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Complaint complaint)
{
if (!ModelState.IsValid)
{
return View();
}
try
{
var originalComplaint = (from c in _entities.ComplaintSet.Include("Complainants")
where c.Id == complaint.Id
select c).FirstOrDefault();
_entities.ApplyPropertyChanges(originalComplaint.EntityKey.EntitySetName, complaint);
_entities.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Просмотреть код (это частичное представление, которое вызывается Create/Edit Views, которое также строго типизировано с жалобой):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ProStand.Models.Complaint>" %>
<%= Html.ValidationSummary() %>
<% using (Html.BeginForm()) {%>
<table cellpadding="0" cellspacing="0" class="table">
<tr>
<td>
<label for="DateReceived">Date Received:</label>
<%= Html.TextBox("DateReceived") %>
<%= Html.ValidationMessage("DateReceived", "*") %>
</td>
<td>
<label for="DateEntered">Date Entered:</label>
<%= Html.TextBox("DateEntered")%>
<%= Html.ValidationMessage("DateEntered", "*") %>
</td>
</tr>
<tr>
<td>
<label for="Concluded">Concluded:</label>
<%= Html.CheckBox("Concluded")%>
<%= Html.ValidationMessage("Concluded", "*") %>
</td>
<td>
<label for="IncidentDate">Incident Date:</label>
<%= Html.TextBox("IncidentDate")%>
<%= Html.ValidationMessage("IncidentDate", "*") %></td>
</tr>
</table>
<hr />
<table>
<% if (Model != null) {
int i = 0;
foreach (var complainant in Model.Complainants){ %>
<%= Html.Hidden("Complainants[" + i + "].Id", complainant.Id)%>
<tr>
<td>
<label for="Surname">Surname:</label>
<%= Html.TextBox("Complainants[" + i + "].Surname", complainant.Surname)%>
<%= Html.ValidationMessage("Surname", "*")%>
</td>
<td>
<label for="GivenName1">GivenName1:</label>
<%= Html.TextBox("Complainants[" + i + "].GivenName1", complainant.GivenName1)%>
<%= Html.ValidationMessage("GivenName1", "*")%>
</td>
</tr>
<% i++; %>
<% }} %>
<tr>
<td colspan=2>
<input type="submit" value="Submit" />
</td>
</tr>
</table>
<% } %>
<div>
<%=Html.ActionLink("Back to List", "Index") %>
</div>