3

- -编辑 - -

我有这个模型

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 让我们变得懒惰... :)

4

1 回答 1

4

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

在 Views/EditorTemplates 文件夹中创建一个视图 Address.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){
}
于 2013-01-24T00:29:22.383 回答