我有一个包含其他对象集合的视图模型。
public ParentViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public List<ChildViewModel> Child { get; set; }
}
public ChildViewModel
{
public int Id { get; set; }
public string FirstName { get; set; }
}
在我的一个视图中,我将ParentViewModel作为模型传递,然后使用
<%: Html.EditorFor(x => x) %>
显示Id和Name属性的表单。
当用户点击一个按钮时,我通过Ajax调用一个动作来加载一个局部视图,该视图包含一个Child的集合:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Child>>" %>
<%: Html.EditorFor(x => x) %>
然后使用自定义模板Child显示传入的每个子项的表单。
我遇到的问题是Child自定义模板创建的表单不使用DefaultModelBinder使用的命名约定。
即字段名称(由Ajax加载时):
[0].FirstName
而不是:
Child[0].FirstName
所以我的控制器中的编辑操作:
[HttpPost]
public virtual ActionResult Edit(int id, FormCollection formValues)
{
ParentViewModel parent = new ParentViewModel();
UpdateModel(parent);
return View(parent);
}
从提交的表单重新创建ParentViewModel不起作用。
我想知道通过Ajax在自定义模板中完成加载然后能够使用UpdateModel的最佳方法是什么。
答案 0 :(得分:9)
答案 1 :(得分:2)
嗯...我个人会建议使用JSON结果,而不是HTML结果,你在页面中摆弄......
使系统更清洁。和你的回发工作; - )
答案 2 :(得分:1)
我找到了另一种方法来实现这一点,这在我的特殊情况下有效。
而不是通过Ajax加载部分过孔,强制类型为子集合,如:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Child>>" %>
我为父类型创建了一个强类型视图,然后在列表中调用了EditorFor,如下所示:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Parent>" %>
<%: Html.EditorFor(x => x.ChildList) %>
然后调用自定义显示模板,结果是所有HTML元素都被正确命名,默认模型绑定器可以将所有内容重新组合在一起。