我有一个局部视图,可以将对象列表呈现为表格格式并允许编辑值...
<%@ 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>
<% } %>
答案 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>
<% } %>