2010-08-05 83 views
31

我是爱好 MVC 2.整个事情很适合网络。如何在迭代器中使用Html.DisplayFor?

有功能一块,但是,我不能哄出Html.DisplayFor()功能:

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

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

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

<% } %> 

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

回答

63

其实,我想通了。我多么愚蠢。

这工作:

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

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

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

<% } %> 
+2

我认为,我更愚蠢,因为我不知道如何解释这一点。表达式中不使用lambda形式参数m。那么这仅仅是因为_DisplayFor_需要它吗?另外,我预计'@ Html.Display(item.BarBaz)'也可以工作,但不会呈现任何内容。 – 2013-09-05 11:10:18

+0

@ R.Schreurs看来lambda需要是一个'Func'表达式,它将模型的类型作为参数,但它可以返回任何东西。 – JohnnyHK 2014-04-03 03:40:38

+0

我也很蠢:) – 2014-11-26 09:22:53

10

您可以通过从在foreach路程,使用普通的for循环完成它:

<% for (int i = 0; i < Model.Count(); i++) { %> 

    <%: Html.DisplayFor(p=> p.ElementAt(i).BarBaz) %> 

<%} %> 

另一种选择是创建了一个Foo对象,只显示你想要的信息PartialView。

<% foreach (var item in Model) 
    { 
     Html.RenderPartial("FooBarBazLine", item); 
    } %> 
+1

我喜欢选项2更好 – Necros 2010-08-05 23:28:47

+1

+1,但我与丧尸/选项2更清洁 – Tahbaza 2010-08-06 01:47:40

+1

我同意选项2是一个更好的解决方案。我首先考虑了选项1,并且没有任何理由将其删除,因为它解决了问题。 – sgriffinusa 2010-08-06 03:20:27

3

Html.DisplayFor可以自动遍历集合,显示用于集合中的每个元件的局部视图。

您需要做的第一件事是创建一个实际的模型类,集合是类的一个属性。

public class Bar 
{ 
    public IEnumerable<Foo> foo { get; set; } 
} 

从您的控制器而不是原始集合中返回这个类。

其次,你需要一个Foo类的显示模板。显示模板是部分视图,需要放置在文件夹Views/Shared/DisplayTemplates中。

编辑:如果您想将模板限制到特定的控制器,您可以将它们放在Views的控制器子文件夹中。有关更多信息,请参见this question

以下是在剃刀语法的例子:

@model YourNameSpace.Foo 
<p>@Model.BarBaz</p> 

保存它作为在上面给出的DisplayTemplatesFoo.cshtml

这个模板非常简单,因为它基于你只是显示一个字符串的例子,但是如果集合元素有一个拥有自己属性的类,你可以创建一个更复杂的模板。

现在在原来的观点,你可以摆脱循环的全部,只是写

@Html.DisplayFor(m => m.foo) 

注意foo是在新的模型类的属性包含您之前架设到收旧名称。

DisplayFor将自动知道foo属性类型(集)Foo,拿起在DisplayTemplates文件夹中的Foo.cshtml模板,一次显示它在foo每个元素。

+0

想象一下你有很多模型,有这样的列表** IEnumerable **。你打算为每一千个实体创建一个模板吗?所有你需要的只是基本类型的通用模板,比如字符串,整数,布尔等等。 – Alexander 2015-10-01 12:31:45

+0

你真的不需要吧,如果foo集合是可访问的,比如说静态的?或者它只是一个局部变量? – toddmo 2017-01-02 00:13:17

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,我们可以直接指示instanc e在循环中显示。

最后,我和你在一起Anders E. Andersen的答案模板使用同意

0

在剃刀我使用

@Html.DisplayFor(model => item.CreatedDate)