8

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

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

4 回答 4

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>

请注意,partial 现在是强类型的,whoozit.Models.PictureModel而不是IList<whoozit.Models.PictureModel>. 现在剩下的就是从主视图中包含这个部分:

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

主视图模型上Pictures的类型属性在哪里。IList<whoozit.Models.PictureModel>这将自动为集合的每个元素调用部分元素,这样您就不需要在视图中编写丑陋的循环。

它只是按照约定工作:partial 需要被称为PictureModel.ascx列表元素的类型名称并位于~/Views/Home/EditorTemplatesor~/Views/Shared/EditorTemplates文件夹中。

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

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

<%: Html.TextBoxFor(x => x.Name) %>
于 2010-09-15T20:58:43.983 回答
2

您可以通过使用 for 循环遍历模型来使用强类型辅助方法。这也将使“名称”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

于 2010-12-19T19:56:34.520 回答
1

您正在告诉您的部分视图期待 whoozit.Models.PictureModel 项目的列表。然后你的 foreach 正在寻找 whoozit.Models.Picture 而不是 PictureModel。下面是我通常会如何做这样的事情。确保您尝试枚举的列表是正确的类型。如果图片类来自 PictureModel 中的集合,请确保您正在使用 Model。无论在 foreach 中。

尝试这个:

<% foreach(var p in Model) { %>
<td>
<%: Html.TextBoxFor(p => p.name) %>
<%: Html.ValidateFor(p => p.name) %>
</td>
<% } %>
于 2010-09-14T17:35:13.927 回答
1
<%= Html.TextBoxFor(p => p.name) %> 
于 2010-09-14T16:40:21.473 回答