嵌套模型绑定

时间:2013-01-23 22:27:18

标签: asp.net-mvc-4 model-binding actionresult

--- --- EDIT

我有这个模型

public class MainModel {
  string Name;
  List<Address> Addresses;
}

public class Address {
  string prop2;
}

创建视图非常容易,但我没有找到在POST请求中绑定它的方法。我想避免循环使用Request.Form

查看

  @foreach (var obj in Model.Address)
  {
    <tr>
      <td>            
        <input type="text" id="@string.Format("obj.Name.{0}", obj.Id)" name="@string.Format("obj.Name.{0}", obj.Id)" value="@Model.Name" />
        //I'm not able to overwrite the name attribute, still working on that
      </td>
    </tr>
  }

有没有办法在ActionController中自动绑定此列表?像

这样的东西
public ActionResult Edit(MainModel model, List<Address> objects)

我想我必须创建一个自定义模型绑定,但我找不到这样做的方法

...... MVC让我们变得懒惰......:)

1 个答案:

答案 0 :(得分:4)

从阅读你的要求,你可能会过度思考解决方案。

在Views / EditorTemplates文件夹中,创建一个类似于

的View.cshtml视图
@model SampleMvc.Models.Address
    <tr>
        <td>
            @Html.HiddenFor(x=>x.Id)            
            @Html.TextBoxFor(x=>x.Prop2)
        </td>
    </tr>

在“编辑”视图中,标记类似于:

@using (Html.BeginForm()) {
    <table>
        @Html.EditorFor(x=>x.Name)
        <br/>
        <table>
            @Html.EditorFor(x=>x.Addresses)
        </table>
    </table>
    <input type="submit" id="submit" value="Submit"/>
}

EditorFor语句将使用地址编辑器模板来渲染标记。

如果您需要添加新地址的功能,可以使用客户端脚本来查找最高ID并注入以下标记

<tr>
   <td>
      <input id="Addresses_{HIGHESTIDVALUEHERE}__Id" type="hidden" value="{HIGHESTIDVALUEHERE}" name="Addresses[{HIGHESTIDVALUEHERE}].Id" data-val-required="The Id field is required." data-val-number="The field Id must be a number." data-val="true">
<input id="Addresses_{HIGHESTIDVALUEHERE}__Prop2" type="text" value="" name="Addresses[{HIGHESTIDVALUEHERE}].Prop2">
   </td>
</tr>

然后您的控制器操作变为

public ActionResult Edit(MainModel model){
}