2012-08-28 45 views
8

Tengo un modelo con un tipo complejo, es decir Usuario/Direcciones/Lista de DireccionesMVC Html.DisplayNameFor en un modelo complejo

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

En mi opinión estoy mostrando esta

<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> 

El DisplayNameFor La calle/ciudad/estado no funciona.

¿Cuál es la forma correcta de obtener DisplayNameFor en un subobjeto?

TIA J

+0

Trate de usar un simple 'bucle for', en lugar de' foreach'. –

+0

¿Qué sucede es que '' Html.DisplayNameFor (m => Model.Addresses.Street.First()) '? Normalmente solo escribo manualmente las etiquetas. –

+0

Quiero usar dataannotaciones para los nombres. Tratando de mantener siempre cadenas así fuera del código. –

Respuesta

9

me cambió

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

a

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

No utilice @Html.DisplayNameFor(m => Model.Addresses[0].Street) porque si tiene que editar la primera fila, que no será capaz de esta manera.

Todo funciona como se espera ahora.

+0

Cuando trato de usar el [0] me da un error de tiempo de ejecución "No se puede aplicar la indexación con [] a una expresión de tipo 'System.Data.Objects.DataClasses.EntityCollection

'" – ThatAintWorking

+2

¿Qué sucede si las direcciones están vacías? Cuando la directiva @model recibe un IEnumerable , se da cuenta ... – Dean

0

La forma en que está utilizando DisplayNameFor está mal. Addresses es una lista y no tiene propiedades como Street, City, State. Entonces, ¿cómo espera que se muestre el nombre?

No es tan simple usar directamente los nombres en la vista en lugar de usar el asistente en este caso.

+1

¿Cuál es su solución? – Zapnologica

1

También puede usar el Linq para evitar el error de indexación. Utilicé este es mi código -

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

Y el siguiente error desapareció.

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

Sin embargo, es mejor utilizar el nombre directamente mediante la siguiente instrucción

@Html.DisplayName("Street") 
1

Esto podría ser mejor:

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

también funcionará en caso de que la lista está vacía

+1

¿No daría como resultado un NRE si la lista está vacía? – TZHX

+0

no va a funcionar el la lista esta vacía –

0

Para mostrar el nombre de la propiedad de la dirección, puede definir un modelo Adress vacío

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

y utilizar de esta manera

@Html.DisplayNameFor(m => adress.Street) 
Cuestiones relacionadas