2010-08-05 45 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)