複数のモデルが送信されているフォームのバインドに問題があります。苦情情報と1対多の苦情を含む苦情フォームがあります。フォームを送信しようとしていますが、バインドでエラーが発生します。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();
}
}
ビューコード(これは、ビューの作成/編集によって呼び出される部分的なビューであり、苦情で強く入力されます):
<%@ 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>