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

时间:2010-09-14 16:36:58

标签: asp.net-mvc html-helper strong-typing

我有一个局部视图,可以将对象列表呈现为表格格式并允许编辑值...

<%@ 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 个答案:

答案 0 :(得分:8)

首先,您不应该在视图中进行迭代。迭代意味着循环,循环意味着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是主视图模型上IList<whoozit.Models.PictureModel>类型的属性。这将自动为集合中的每个元素调用partial,这样您就不需要在视图中编写丑陋的循环。

它只是按惯例工作:部分需要被称为PictureModel.ascx作为列表元素的类型名称,位于~/Views/Home/EditorTemplates~/Views/Shared/EditorTemplates文件夹中。

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

备注:在.NET中,约定是以大写字母开头的属性名称,因此我建议您将name属性重命名为Name。写作和阅读感觉更自然:

<%: Html.TextBoxFor(x => x.Name) %>

答案 1 :(得分:2)

您可以通过使用for循环遍历模型来使用强类型辅助方法。这也将使“name”html属性独一无二,因此模型绑定器可以帮助您在保存的情况下将值映射回模型。

<% 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

答案 2 :(得分:1)

<%= Html.TextBoxFor(p => p.name) %> 

答案 3 :(得分:1)

您告诉您的部分视图需要一个whoozit.Models.PictureModel项列表。然后你的foreach正在寻找whoozit.Models.Picture而不是PictureModel。以下是我通常会做这样的事情。确保您尝试枚举的列表是正确的类型。如果图片类来自PictureModel内的集合,请确保你正在做模型。无论在foreach中。

试试这个:

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