我爱 MVC 2.整个事情恰好适合网络。
然而,有一项功能是我无法哄骗Html.DisplayFor()
功能:
<@ Page Inherits="ViewPage<IEnumerable<Foo>>">
<% foreach(var item in Model) { %>
<%: Html.DisplayFor(item.BarBaz) %>
<% } %>
我需要能够将DisplayTemplate用于此值。有没有办法做到这一点?
答案 0 :(得分:66)
实际上,我想通了。我多么愚蠢。
这有效:
<@ Page Inherits="ViewPage<IEnumerable<Foo>>">
<% foreach(var item in Model) { %>
<%: Html.DisplayFor(m => item.BarBaz) %>
<% } %>
答案 1 :(得分:12)
你可以通过远离foreach并使用常规for循环来完成它:
<% for (int i = 0; i < Model.Count(); i++) { %>
<%: Html.DisplayFor(p=> p.ElementAt(i).BarBaz) %>
<%} %>
另一种选择是创建一个PartialView,它接受一个Foo对象,只显示你想要的信息。
<% foreach (var item in Model)
{
Html.RenderPartial("FooBarBazLine", item);
} %>
答案 2 :(得分:6)
这是一个老问题,但我想有人可以从我的解决方案中获益:
Aspx视图
<%@ Page Inherits="ViewPage<IEnumerable<Foo>>" %>
<% foreach (var item in Model) { %>
<%: Html.DisplayFor(m => item) %>
<% } %>
Razor视图
@model IEnumerable<Foo>
@foreach (var item in Model)
{
Html.DisplayFor(m => item)
}
由于DisplayFor
接受隐式类型的lambda,我们可以直接指示要在循环中显示的实例。
最后,我同意Anders E. Andersen对模板用法的回答
答案 3 :(得分:3)
Html.DisplayFor可以自动迭代集合,显示集合中每个元素的部分视图。
您需要做的第一件事是创建一个实际的模型类,该集合是该类的属性。
public class Bar
{
public IEnumerable<Foo> foo { get; set; }
}
从控制器返回此类而不是原始集合。
其次,你需要一个Foo类的显示模板。显示模板是需要放在文件夹Views/Shared/DisplayTemplates
中的部分视图。
编辑:如果要将模板限制为特定控制器,也可以将它们放在视图的控制器子文件夹中。有关详细信息,请参阅this question。
这是剃刀语法的一个例子:
@model YourNameSpace.Foo
<p>@Model.BarBaz</p>
将其保存为Foo.cshtml
在上面给出的DisplayTemplates
文件夹中。
此模板非常简单,因为它基于您只显示字符串的示例,但如果具有自己属性的类的集合元素可以创建更精细的模板。
现在在原始视图中,您可以完全摆脱循环,只需编写
@Html.DisplayFor(m => m.foo)
注意foo
是新模型类中属性的名称,其中包含您之前循环的旧集合。
DisplayFor会自动知道foo
属性的类型(集合)Foo
,然后选择Foo.cshtml
文件夹中的DisplayTemplates
模板并将其显示一次foo
中的每个元素。
答案 4 :(得分:1)
在Razor我正在使用
@Html.DisplayFor(model => item.CreatedDate)
答案 5 :(得分:0)
请注意,表单POST上的DisplayFor实际上不会创建可在控制器中引用的字段。如果您需要在提交的POST方法中引用字段,则需要使用其他HiddenFor。