2011-09-16 60 views
21

我有一個與之相關的強類型模型視圖LabelFor()在foreach

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
        Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %> 

的SomeViewModel看起來像這樣

class SomeViewModel 
{ 
    public IEnumerable<Foo> Foos {get; set;} 
} 

說foo是

class Foo 
{ 
    public string Bar {get; set;} 
} 

並在視圖中

<% foreach (var item in Model.Foos) { %> 
    <tr> 
     <td> 
      <%= Html.LabelFor(f => f.Bar) %> 
     </td> 

我不知道如何使用Html.LabelFor()

有人可以幫我這顯示itemBar財產?

感謝,

+0

您是否獲得與該代碼錯誤? – AndrewC

+0

@AndyC我不知道如何在Bar獲得循環變量'item'。 f => f。[這裏沒有酒吧。只有Foos]' –

+0

@TheOtherGuy,我見過的大多數例子都將標籤硬編碼爲表格標題,然後在每個標籤之後完成。你是否在桌上展示你的?是否有一個原因,你需要在你的foreach標籤(它會只是不斷重複你的標籤的每一行) – Manatherin

回答

2

你試過

<% for (var i=0; i<Model.Foos.Count();i++) { %> 
    <tr> 
     <td> 
      <%= Html.LabelFor(f => f.Foos[i].Bar) %> 
     </td> 

的LabelFor擴展使用LAMDA表達式從模型對象去選定的屬性,考慮f表示模型中的變量substituion。所以你需要一種從你的模型到你選擇的屬性的方法。您告訴LabelFor,創建一個名爲f的局部變量並將其賦值爲您的模型的值。然後使用=>之後的位來確定目標屬性。

如果你不顧一切地使用foreach,你就必須有翻譯項回到原始模型的屬性(例如對於數組作爲Gledrius說x=>x.Foos[Model.Foos.IndexOf(foo)])

失敗的一種方式,如果你只是希望文本值

使用「<%=項%>」,而不是整個labelfor或者如果你有ASP.NET 4和MVC2或爲HTML編碼善良

+0

我會試試這個,但不可能使用'foreach'嗎? –

+1

LabelFor將表達式作爲參數,因此您無法將其傳遞給對象(因此您無法將其傳遞給您的項目變量)。 – AndrewC

+0

查看更新的答案 –

0

here,看起來你需要指定屬性的DisplayName

[DisplayName("My Bar")] 
public string Bar { get; set; } 
+2

這不是他要求的。 – SLaks

+0

問題是,我不知道如何去指定屬性欄。它是'f => f.Bar'(不編譯)或'item => item.Bar'(不編譯) –

+0

@TheOtherGuy - 如何'Html.LabelFor(x => item.Bar) ' – SwDevMan81

0

如果FOOS會名單,這將是這樣的:

Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)]) 
0

您正在迭代您的Foo,但根本不使用item變量。

+1

我如何使用'item'?當我做'item => item.Bar'時,我得到'一個名爲item的參數不能在這個範圍內聲明...' –

+0

爲什麼這會被低估? – AndrewC

39

更好地利用<%: item %>而是執行此操作:

<% foreach (var item in Model.Foos) { %>  
<tr>   
    <td>    
     <%= Html.LabelFor(f => item.Bar) %>   
    </td> 
<% } %> 

而不是f => f.Bar do f => item.Bar,其中item是foreach循環中變量的名稱。

這裏是更美麗的剃刀語法:)

@foreach(var item in Model.Foos) { 
<tr> 
    <td> 
     @Html.LabelFor(f => item.Bar) 
    </td> 
    <td> 
     @Html.DisplayFor(f => item.Bar) 
    </td> 
</tr> 
} 
+4

應該標記爲IMO的正確答案。 – richeym

+3

同意,這是正確的答案。 – Dean

+0

太棒了。不知道如何以及爲什麼。對不匹配需求的解釋會對noobs有幫助。 – Snekse

2

你也可以只編寫自定義擴展,這不是直接連接到頁面的模型。

public static MvcHtmlString LabelForItem<T, V>(this HtmlHelper html, T obj, Expression<Func<T, V>> expression) 
    { 
     Func<T,V> func = expression.Compile(); 
     V val = func(obj); 
     return html.Label(val.ToString()); 
    } 

你會使用它,就像這樣:

@foreach (Foo foo in Model) 
{ 
    <p> 
     @(Html.LabelForItem<Foo, string>(foo, f => f.Name)) 
    </p> 
}