【问题标题】:How to use EditorFor inside a foreach如何在 foreach 中使用 EditorFor
【发布时间】:2016-12-10 04:24:58
【问题描述】:

我有一个模型:

public class MyListModel
{
    public int ID {get;set;}
    public List<User> Users{get;set;}
}

如何在 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>

【问题讨论】:

    标签: asp.net-mvc mvc-editor-templates


    【解决方案1】:
    @Html.EditorFor(x=> item.Enabled)
    

    已经多次指出,将这样的模型发布回服务器在默认情况下在 mvc 中不起作用。 为了在循环中正确编辑EditorFor - for 应该使用如下:

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

    【讨论】:

    • 绝对有效。 lambda 的“右手边”不必引用“左手边”。
    • 请记住,lambda 只是方法定义。方法可以采用参数“x”,但实际上并不在方法体中使用它。一个巧妙的技巧,当然!我强烈推荐阅读 Brad Wilson 关于模板化助手的 5 部分系列:bradwilson.typepad.com/blog/2009/10/…
    • 请注意,这将导致 EditorFor 创建的所有元素具有相同的名称和 ID。多个元素共享同一个Id是无效的。
    • 这将用于显示属性,但由于@DaRKoN_ 提到的原因,它不会在回发时正确绑定。 DefaultModelBinder 不知道如何将未索引的属性与重复的名称绑定。这些名称是 MVC 用来将请求中的值映射到模型属性的名称。
    • 此解决方案有效,但当您将表单发回服务器时会丢失绑定。所以最好的方法是使用一个简单的for循环。
    【解决方案2】:
    @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>
    }
    

    另外还需要用户的至少一个属性的一些隐藏变量:

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

    不是你所说的优雅,但它适用于你的 post 操作中的绑定。

    【讨论】:

      【解决方案3】:

      您自己明确使用foreach 是否还有其他原因(示例除外)?您可以为User class 制作自定义编辑器(或显示)助手并制作@Html.EditorFor(model=&gt;model.Users)。 Razor 将在内部使用 foreach 来使用自定义助手处理每个元素。

      对于那些真正不知道如何处理这些案例的访问问题的人来说,这只是一个想法。

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多