【问题标题】:How to do MVC model binding with dynamically loaded form elements如何使用动态加载的表单元素进行 MVC 模型绑定
【发布时间】:2013-08-20 20:10:31
【问题描述】:

假设我有一个这样的视图模型

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

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

在实际的视图标记上,我加载了 MyView。我有一个 DynamicViewModel 的 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

【问题讨论】:

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


    【解决方案1】:

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

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

    http://jsfiddle.net/q7dLy/

    如果您正在处理更复杂的视图模型,例如带有集合的表单,您仍然应该能够按照ASP.net Wire Format 设置适当的idname 属性

    【讨论】:

      【解决方案2】:

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

      你可以使用

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多