ASP.Net MVC2自定义模板通过Ajax和模型更新加载

时间:2010-07-23 10:45:20

标签: asp.net-mvc ajax asp.net-mvc-2 partial-views

我有一个包含其他对象集合的视图模型。

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的最佳方法是什么。

3 个答案:

答案 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元素都被正确命名,默认模型绑定器可以将所有内容重新组合在一起。