代码之家  ›  专栏  ›  技术社区  ›  yamspog

mvc.net如何在遍历列表时使用强类型助手

  •  8
  • yamspog  · 技术社区  · 16 年前

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %>
    
    <% foreach (whoozit.Models.PictureModel p in Model)
               { %>
    
      <td>
      <%: Html.TextBox("name",p.name) %>
      <%: Html.ValidationMessage(p.name) %>
      </td>  
    
    <% } %>
    

    我想重构它以利用mvc2中的强类型html助手。我在理解如何创建lambda表达式时遇到了困难,希望能得到一些帮助。我觉得下面的说法不太正确。

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %>
    
    <% foreach (whoozit.Models.PictureModel p in Model)
               { %>
    
      <td>
      <%: Html.TextBoxFor(???) %>
      </td>  
    
    <% } %>
    
    4 回复  |  直到 16 年前
        1
  •  8
  •   Darin Dimitrov    16 年前

    首先,不应该在视图中迭代。迭代意味着循环,循环意味着C#/VB.NET版,C级#/VB.NET版在一个观点导致意大利面代码。

    我建议你使用 Editor Templates . 这样就不需要在视图中编写循环。在中添加以下文件 ~/Views/Home/EditorTemplates/PictureModel.ascx :

    <%@ Control Language="C#" 
        Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %>
    <td>
        <%: Html.TextBoxFor(x => x.name) %>
        <%: Html.ValidationMessageFor(x => x.name) %>
    </td>
    

    请注意,分部现在被强类型化为 whoozit.Models.PictureModel 而不是 IList<whoozit.Models.PictureModel>

    <%: Html.EditorFor(x => x.Pictures) %>
    

    在哪里? Pictures 是类型的属性 在主视图模型上。这将自动为集合的每个元素调用partial,这样就不需要在视图中编写难看的循环。

    PictureModel.ascx 作为列表元素的类型名,位于 ~/Views/Home/EditorTemplates ~/Views/Shared/EditorTemplates

    编辑器/显示模板将使您的视图更加优雅。

    name 属性到 Name . 只是觉得写作和阅读更自然:

    <%: Html.TextBoxFor(x => x.Name) %>
    
        2
  •  2
  •   rax    15 年前

    <% for (int i = 0; i < Model.Count; i++) { %>
    
      <%: Html.TextBoxFor(m => m[i].Name) %>
      <%: Html.TextBoxFor(m => m[i].SomethingElse) %>
    
    <% } %>
    

    请在此处阅读更多。。 http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

        3
  •  1
  •   D'Arcy Rittich    16 年前
    <%= Html.TextBoxFor(p => p.name) %> 
    
        4
  •  1
  •   Terry Nederveld    16 年前

    你在告诉你的局部视图期望一个喔。模型。图片模型项目。那么你的祖先正在寻找喔。模型。图片不是图片模型。下面是我通常会怎么做这样的事情。确保您试图枚举的列表是正确的类型。如果picture类来自PictureModel内的集合,请确保您正在执行模型。

    试试这个:

    <% foreach(var p in Model) { %>
    <td>
    <%: Html.TextBoxFor(p => p.name) %>
    <%: Html.ValidateFor(p => p.name) %>
    </td>
    <% } %>