我是 MVC 新手,并且真的很挣扎于我认为这应该是一个非常常见的场景。我正在使用 MVC2 RTM 和模型对象的实体框架。
我正在做的工作:
包含子对象集合的父对象的编辑视图。该表单显示父对象的所有可编辑字段,并迭代并显示所有关联子对象的所有可编辑字段(在同一视图中)。我能够成功处理控制器中的编辑操作,但当我尝试将表单集合中的值绑定到 EF 模型对象时遇到问题。
问题:
在我的控制器函数中,当我调用 TryUpdateModel 并传递父对象时,出现以下错误:
“EntityCollection 已初始化。仅应在对象图反序列化期间调用 InitializeRelatedCollection 方法来初始化新的 EntityCollection。”
我看过很多其他人的帖子,都遇到过类似的问题,但还没有找到解决方案。如果不构建自定义模型绑定程序,这是否不可能?如果有人有一个有效的例子,我将不胜感激。由于某种原因,我能够迭代子集合并在子对象上成功执行 TryUpdateModel,但是当我在父对象上调用它时,会引发上述错误。理想情况下,我想为父级调用一次,并从表单更新整个对象树。
这是控制器代码:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
EFEntities ef = new EFEntities();
ParentObject parent = ef.ParentObjects.SingleOrDefault(p => p.ID == id);
if (ModelState.IsValid)
{
int i = 0;
foreach (child in parent.ChildObjects)
{
//this works fine
TryUpdateModel(child, "ChildObjects[" + i + "]");
i++;
}
//this blows up
if (TryUpdateModel(parent))
{
ef.SaveChanges();
return RedirectToAction("Details", new { id = parent.ID });
}
}
return View(parent);
}
感谢您提出这个问题,尽管没有得到回答,但它给了我答案。我能找到的最好的事情就是(使用你的例子):
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
EFEntities ef = new EFEntities();
ParentObject parent = ef.ParentObjects.SingleOrDefault(p => p.ID == id);
if (ModelState.IsValid)
{
int i = 0;
foreach (child in parent.ChildObjects)
{
//this works fine
TryUpdateModel(child, "ChildObjects[" + i + "]");
i++;
}
//exclude the collections and it won't blow up...
if (TryUpdateModel(parent, "Parent", null, new string[] {"ChildObjects"}))
{
ef.SaveChanges();
return RedirectToAction("Details", new { id = parent.ID });
}
}
return View(parent);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)