如何在foreach中使用EditorFor

Jer*_*emy 37 asp.net-mvc mvc-editor-templates

我有一个模特:

public class MyListModel
{
    public int ID {get;set;}
    public List<User> Users{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

如何在foreach中使用Html.EditorFor方法?

@model MyListModel
<table>
  <tr>
    <th></th>
  </tr>
  @foreach (var item in Model.Users) {
     <tr>
       <td>
          @Html.EditorFor(item.Enabled)
       </td>
     </tr>
  }
</table>
Run Code Online (Sandbox Code Playgroud)

Ale*_*ran 63

@Html.EditorFor(x=> item.Enabled)
Run Code Online (Sandbox Code Playgroud)

有人多次指出,将这样的模型发布回服务器默认情况下不能在mvc中运行.为了EditorFor在循环中正确编辑- for应该用作:

 @for(var i = 0; i< Model.Users.Count;i++){
      Html.EditorFor(i=>Model.Users[i])
 }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将导致EditorFor创建的所有元素具有相同的名称和Id.共享相同Id的多个元素无效. (8认同)
  • 请记住,lambdas只是方法定义.方法可以采用参数"x",而不是实际在方法体中使用它.一个巧妙的技巧,当然!我强烈建议阅读Brad Wilson关于模板化助手的5部分系列文章:http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html (6认同)
  • 绝对有效.lambda的"右手侧"不必参考"左手侧". (4认同)
  • 我很确定这不起作用.你测试过了吗? (2认同)
  • 这将显示属性,但由于@DaRKoN_提到的原因,它*不会在回发时正确绑定.DefaultModelBinder不知道如何将未索引的属性与重复的名称绑定.这些名称是MVC用于将请求中的值映射到模型属性的名称. (2认同)
  • 此解决方案正在运行,但在将表单发布回服务器时将丢失绑定.所以最好的方法是使用一个简单的for循环. (2认同)

Jam*_*mie 12

@for (var i = 0; i < Model.Users.Count; i++)
{
<tr>
    <td>@Html.EditorFor(model => model.Users[i].Enabled)</td>
    <td>@Html.EditorFor(model => model.Users[i].FirstName)</td>
    <td>@Html.EditorFor(model => model.Users[i].LastName)</td>
</tr>
}
Run Code Online (Sandbox Code Playgroud)

此外,还需要为用户的至少一个属性设置一些隐藏变量:

@for (var i = 0; i < Model.Users.Count; i++)
{
    @Html.HiddenFor(model => model.Users[i].FirstName)
}
Run Code Online (Sandbox Code Playgroud)

不是你会称之为优雅,但它适用于你的后期行动中的绑定.