gpt4 book ai didi

c# - 从强类型 View 提交多个模型表单的模型绑定(bind)

转载 作者:可可西里 更新时间:2023-11-01 09:09:42 24 4
gpt4 key购买 nike

我在绑定(bind)提交了多个模型的表单时遇到问题。我有一份投诉表,其中包括投诉信息以及一对多投诉人。我正在尝试提交表单,但在绑定(bind)时遇到错误。 ModelState.IsValid 始终返回 false。

如果我调试并查看 ModelState 错误,我会听到一句话:“EntityCollection 已经被初始化。InitializeRelatedCollection 方法应该只在对象图的反序列化期间被调用以初始化新的 EntityCollection”。

此外,在调试时,我可以看到投诉模型确实填充了表单提交中的投诉人,所以看起来这部分工作正常。

我不确定我正在做的事情是否无法使用默认的 ModelBinder,或者我是否只是没有以正确的方式去做。我似乎找不到任何具体的例子或文档。在 stackoverflow 上可以找到一个非常相似的问题 here但它似乎不处理强类型 View 。

Controller 代码:

    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();
}
}

查看代码(这是由创建/编辑 View 调用的部分 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>

最佳答案

盲猜:

改变:

<%= Html.TextBox("Complainants[" + i + "].Surname", complainant.Surname)%>

与:

<%= Html.TextBox("Complaint.Complainants[" + i + "].Surname",  
complainant.Surname)%>

分别-添加“投诉”。在“投诉人[...”之前

编辑:

这不是正确答案。保留它未删除只是因为这可能会增加一些值(value),直到弹出正确的答案。

编辑 2:

我可能是错的,但对我来说 Entity Framework 似乎存在问题(或者 - 您使用它的方式)。我的意思是 - asp.net mvc 设法从请求中读取值,但无法初始化投诉者集合。

Here是这样写的:

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.

The InitializeRelatedCollection(TTargetEntity) method is used during deserialization only.

更多信息:

Exception:

  • InvalidOperationException

Conditions:

  • 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.

为什么 InitializeRelatedCollection 被触发了两次。不幸的是 - 我不知道为什么。也许这个小调查会对其他人有所帮助 - 对 EF 更有经验。 :)

编辑 3:
这不是这个特定问题的解决方案,更像是一种解决方法,一种处理 mvc 模型部分的正确方法。

创建仅用于演示目的的 View 模型。也从纯 POCO 创建一个新的域模型(因为 EF 将仅在下一个版本中支持它们)。使用 AutoMapper映射 EFDataContext<=>Model<=>ViewModel。

这需要一些努力,但应该这样处理。这种方法从您的模型中移除了表示责任,清理了您的领域模型(从您的模型中移除了 EF 内容)并且将通过绑定(bind)解决您的问题。

关于c# - 从强类型 View 提交多个模型表单的模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1064998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com