如何在迭代器中使用Html.DisplayFor?

时间:2010-08-05 22:27:27

标签: c# asp.net-mvc-2

MVC 2.整个事情恰好适合网络。

然而,有一项功能是我无法哄骗Html.DisplayFor()功能:

<@ Page Inherits="ViewPage<IEnumerable<Foo>>">

<% foreach(var item in Model) { %>

    <%: Html.DisplayFor(item.BarBaz) %>

<% } %>

我需要能够将DisplayTemplate用于此值。有没有办法做到这一点?

6 个答案:

答案 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。