2011-09-16 19 views
21

ho una visione con un modello fortemente tipizzato ad esso associatiLabelFor() in un foreach

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

Il SomeViewModel assomiglia a questo

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

e dire Foo è

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

e nella vista

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

Non sono sicuro di come visualizzare Bar proprietà a item utilizzando Html.LabelFor()

qualcuno può aiutarmi con questo?

Grazie,

+0

State ottenendo un errore con quel codice? – AndrewC

+0

@AndyC Non so come ottenere in Bar per la variabile di ciclo 'item'. f => f. [No Bar qui. solo Foos] ' –

+0

@TheOtherGuy, la maggior parte degli esempi che ho visto hanno codificato con difficoltà le etichette come intestazioni di tabelle e poi le ha fatte per ciascuna dopo. Stai visualizzando il tuo in un tavolo? c'è un motivo per cui hai bisogno dell'etichetta nel tuo foreach (verrà ripetuta costantemente l'etichetta per ogni riga) – Manatherin

risposta

2

Hai provato

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

L'estensione LabelFor utilizza un'espressione lambda per andare dal vostro oggetto modello per la struttura scelta, prendere in considerazione una variabile f substituion per il modello. Quindi hai bisogno di un modo per ottenere dal tuo modello alla proprietà scelta. Stai dicendo a LabelFor, crea una variabile locale chiamata f e assegnala il valore del tuo modello. quindi usa il bit dopo => per determinare la proprietà target.

Se siete disperati per usare il foreach, si dovrebbe avere un modo di tradurre articolo di nuovo a una proprietà del modello originale, (ad esempio per un array come detto Gledrius x=>x.Foos[Model.Foos.IndexOf(foo)])

in mancanza di questo, se avete appena desidera che il valore di testo

uso '<% = item%>' al posto di tutta la labelfor o se si dispone di ASP.NET 4 e MVC2 o meglio l'uso <%: item %> per che la codifica HTML bontà

+0

Lo proverò ma non è possibile usare 'foreach'? –

+1

LabelFor accetta un'espressione come parametro in modo da non poter passare un oggetto (quindi non è possibile passare la variabile dell'oggetto). – AndrewC

+0

vedi risposta aggiornata –

0

Da here, si presenta come è necessario specificare il DisplayName sulla proprietà:

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

Non è quello che sta chiedendo. – SLaks

+0

Il problema è che non so come procedere specificando la proprietà Bar. È 'f => f.Bar' (non viene compilato) o' item => item.Bar' (non viene compilato neanche) –

+0

@TheOtherGuy - Che ne dici di 'Html.LabelFor (x => item.Bar) ' – SwDevMan81

0

se Foos sarebbe la lista, sarebbe simile a questa:

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

Stai iterando su quello di Foo ma non usando affatto la variabile dell'oggetto.

+1

Come uso' item'? quando faccio 'item => item.Bar', ottengo' Un parametro chiamato item non può essere dichiarato in questo ambito ... ' –

+0

Perché è stato downvoted? – AndrewC

39

fare questo, invece:

Invece di f => f.Bar do f => item.Bar, dove item è il nome della variabile nel ciclo foreach.

Ecco la molto più bella sintassi rasoio :)

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

Dovrebbe essere contrassegnato come la risposta corretta, IMO. – richeym

+3

Concordato, questa è la risposta corretta. – Dean

+0

È fantastico. Non sono sicuro del come e perché. Una spiegazione della necessità del mismatch sarebbe utile per i noobs. – Snekse

2

si potrebbe anche solo scrivere un'estensione personalizzata che non è legato direttamente al modello della pagina.

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()); 
    } 

E che ci si utilizza, in questo modo:

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