2012-08-28 15 views
8

Ho un modello con un complesso di tipo vale a dire per l'utente/Indirizzi/Elenco degli indirizziMVC Html.DisplayNameFor su un modello complesso

public class User{ 
public List<Address> Addresses{get;set;} 
} 

Il mio punto di vista io sono la visualizzazione questo

<fieldset><legend>@Html.DisplayNameFor(model=>model.Addresses)</legend> 
<table>  
<tr> 
    <th> 
     @Html.DisplayNameFor(m => Model.Addresses.Street) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Addresses.City) 
    </th> 
<th> 
     @Html.DisplayNameFor(model => model.Addresses.State) 
    </th> 

    </tr> 
@foreach (var item in Model.Addresses) {  
<tr> 
    <td> 
     @Html.DisplayFor(m => item.Street) 
    </td> 
    <td> 
     @Html.DisplayFor(m => item.City) 
    </td> 
    <td> 
     @Html.DisplayFor(m => item.State) 
    </td> 
</tr> 
} 
    </table></fieldset> 

Il DisplayNameFor Via/Città/Stato non funzionano.

Qual è il modo corretto per ottenere DisplayNameFor su un oggetto secondario?

TIA J

+0

provare a utilizzare un semplice 'ciclo for', invece di' foreach'. –

+0

Che cosa succede è '@ Html.DisplayNameFor (m => Model.Addresses.Street.First())'? Normalmente scrivo solo manualmente le etichette. –

+0

Voglio utilizzare le annotazioni di dati per i nomi. Cercando di mantenere sempre le stringhe come fuori codice. –

risposta

9

ho cambiato

@Html.DisplayNameFor(m => Model.Addresses.Street) 

a

@Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street) 

Non usare @Html.DisplayNameFor(m => Model.Addresses[0].Street) perché se è necessario modificare la prima riga, non sarà in grado in questo modo.

Tutto funziona come previsto ora.

+0

Quando provo a usare [0] mi dà un errore di runtime "Impossibile applicare l'indicizzazione con [] a un'espressione di tipo 'System.Data.Objects.DataClasses.EntityCollection

'" – ThatAintWorking

+2

Cosa succede se gli indirizzi sono vuoti? Quando la direttiva @model è data un IEnumerable , viene calcolata ... – Dean

0

Il modo in cui si utilizza DisplayNameFor è sbagliato. Addresses è una lista e non ha proprietà come Street, City, State. Quindi, come ti aspetti che venga visualizzato il nome.

Non è semplice utilizzare direttamente i nomi nella vista anziché utilizzare l'helper in questo caso.

+1

Quindi qual è la tua soluzione? – Zapnologica

1

È inoltre possibile utilizzare il Linq per evitare l'errore di indicizzazione. Ho usato questo è il mio codice -

@Html.DisplayNameFor(m => Model.Addresses.first().Street) 

E il seguente errore è andato via.

Cannot apply indexing with [] to an expression of type 'System.Data.Objects.DataClasses.EntityCollection<Address> 

Tuttavia è meglio usare il nome direttamente utilizzando la seguente istruzione

@Html.DisplayName("Street") 
1

Questo potrebbe essere migliore:

@Html.DisplayNameFor(m => Model.Addresses.FirstOrDefault().Street) 

funziona anche nel caso in cui l'elenco è vuoto

+1

Non risulterebbe in un NRE se l'elenco è vuoto? – TZHX

+0

non funzionerà la lista è vuota –

0

Per visualizzare il nome per la proprietà dell'indirizzo, è possibile definire un modello Adress vuoto

{ 
    var adress =new Models.Address(); 
} 

e utilizzarlo come questo

@Html.DisplayNameFor(m => adress.Street) 
Problemi correlati