我在表单上绑定多个模型时遇到问题.我有一个投诉表单,包括投诉信息以及一对多投诉人.我正在提交表单,但我收到绑定的错误. ModelState.IsValid总是返回false.
@H_301_2@如果我调试和查看ModelState错误,我得到一个说法:
“EntityCollection已经被初始化了,只有调用InitializeRelatedCollection方法才能在反序列化对象图时初始化一个新的EntityCollection”. @H_301_2@另外,在调试时,我可以看到投诉模型由投诉人填写,因此似乎部分正在运作. @H_301_2@我不知道我在做什么是不可能使用默认的ModelBinder,或者如果我不是正确的方式.我似乎没有找到任何具体的例子或文件.在stackoverflow here中可以找到一个非常类似的问题,但它似乎不处理强类型的视图. @H_301_2@控制器代码:
“EntityCollection已经被初始化了,只有调用InitializeRelatedCollection方法才能在反序列化对象图时初始化一个新的EntityCollection”. @H_301_2@另外,在调试时,我可以看到投诉模型由投诉人填写,因此似乎部分正在运作. @H_301_2@我不知道我在做什么是不可能使用默认的ModelBinder,或者如果我不是正确的方式.我似乎没有找到任何具体的例子或文件.在stackoverflow here中可以找到一个非常类似的问题,但它似乎不处理强类型的视图. @H_301_2@控制器代码:
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(); } }@H_301_2@查看代码(这是由创建/编辑视图调用的部分视图,这也是强制类型的投诉):
<%@ 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>
解决方法
盲目猜测:
@H_301_2@更改:
<%= Html.TextBox("Complainants[" + i + "].Surname",complainant.Surname)%>@H_301_2@有:
<%= Html.TextBox("Complaint.Complainants[" + i + "].Surname",complainant.Surname)%>@H_301_2@分别 – 添加“投诉”.之前“投诉人[…] @H_301_2@编辑: @H_301_2@这不是一个正确的答案.留下它取消删除只是因为这可能会添加一些值,直到正确的答案弹出. @H_301_2@EDIT2: @H_301_2@我可能是错的,但对我来说,实体框架似乎有问题(或者你使用它的方式).我的意思是 – asp.net mvc设法从请求中读取值,但无法初始化投诉人集合. @H_301_2@Here写的:
@H_301_2@The InitializeRelatedCollection(TTargetEntity) method initializes an existing EntityCollection(TEntity) that was created by using the default constructor. The EntityCollection(TEntity) is initialized by using the provided relationship and target role names. @H_301_2@The InitializeRelatedCollection(TTargetEntity) method is used during deserialization only.@H_301_2@更多信息:
@H_301_2@Exception:@H_301_2@发生两次初始化重定义选项.不幸的是,我没有明确的想法为什么.也许这个小调查将有助于别人 – 更有经验的EF.@H_301_2@Conditions:
- InvalidOperationException
- When the provided EntityCollection(TEntity) is already initialized.
- When the relationship manager is already attached to an ObjectContext.
- When the relationship manager already contains a relationship with this name and target role.