如何使用动态加载的表单元素进行MVC模型绑定

时间:2013-08-20 20:10:32

标签: c# asp.net-mvc-3 model-binding

说我有这样的视图模型

class MyView
{
    DynamicViewModel MyDynamicViewModel {get; set;}
}

class DynamicViewModel 
{
    string A {get; set;};
}

在实际的视图标记上,我加载了MyView。我有一个DynamicTeModel的EditorTemple局部视图,因为我希望它是可重用的,它本身也有一些动态元素。

此外,MyView页面有自己的表单元素,用于确定MyDynamicViewModel的内容。因此,根据用户输入/点击的内容,MyDynamicViewModel将通过ajax回调重新加载新信息。

这很有效,但由于DynamicViewModel是动态加载的,因此MVC模型绑定器无法知道DynamicViewModel中的值属于MyView.MyDynamicViewModel上的模型。

为了说明,MyDynamicViewModel.A的表单值将使其表单ID等于“A”。但是为了模型绑定,我需要它是MyDynamicViewModel.A,如下所示:

<input id="MyDynamicViewModel.A" name="MyDynamicViewModel.A" type="text"> 

但是这个模板通过ajax加载(控制器方法将视图作为字符串返回,而javascript只是用内容更新div),它不知道“所有者”模型MyView

2 个答案:

答案 0 :(得分:0)

在没有完整查看代码的情况下,我在理解您的问题时遇到了一些麻烦。

根据我的理解,您应该能够在从Ajax调用中返回之后设置html字符串的idname属性。

http://jsfiddle.net/q7dLy/

如果您正在处理更复杂的视图模型,例如带有集合的表单,您仍然可以按照ASP.net Wire Format id和name属性p>

答案 1 :(得分:0)

如果您将MyView作为模型传递给视图

您可以使用

@Html.EditorFor(model => Model.MyDynamicViewModel.A)

但您需要在MyView模型的构造函数中将此模型初始化为

  class MyView
    {
     public MyView()
        {
          MyDynamicViewModel =new DynamicViewModel();
        }
        DynamicViewModel MyDynamicViewModel {get; set;}
    }