2010-04-25 7 views
5

Aceptar, así que tengo una vista de "Detalles" del cliente fuertemente tipada que toma un Modelo de objeto del cliente.ASP.NET MVC/LINQ: ¿Cuál es la forma correcta de iterar a través de un Linq.EntitySet en una vista?

Estoy usando LINQ to SQL y cada Cliente puede tener múltiples (estacionamiento) Espacios.

Esta es una relación FK en la base de datos, por lo que mi modelo de Cliente generado por LINQ tiene una colección de "Espacios". ¡Estupendo!

Aquí es un fragmento de código de mi CustomerRepository donde iterar a través de plazas de aparcamiento del Cliente para eliminar todos los pagos, espacios y, finalmente, el cliente:

public void Delete(Customer customer) 
{ 
    foreach (Space s in customer.Spaces) 
     db.Payments.DeleteAllOnSubmit(s.Payments); 
    db.Spaces.DeleteAllOnSubmit(customer.Spaces); 
    db.Customers.DeleteOnSubmit(customer); 
} 

todo funciona como se esperaba!

Ahora mi punto de vista "Detalles" Quiero llenar una tabla con los espacios del Cliente:

<% foreach (var s in Model.Spaces) 
    { %> 
    <tr> 
     <td><%: s.ID %></td> 
     <td><%: s.InstallDate %></td> 
     <td><%: s.SpaceType %></td> 
     <td><%: s.Meter %></td> 
    </tr> 
<% } %> 

me sale el siguiente error:

foreach statement cannot operate on variables of type 'System.Data.Linq.EntitySet' because 'System.Data.Linq.EntitySet' does not contain a public definition for 'GetEnumerator'

Por último, si añado este bit de codificar a mi clase parcial de cliente y usar el foreach en la vista para iterar a través de los espacios de estacionamiento todo funciona como se esperaba:

public IEnumerable<Space> ParkingSpaces 
{ 
    get 
    { 
     return Spaces.AsEnumerable(); 
    } 
} 

El problema aquí es que no quiero repetirme. También estaba pensando que podría usar un ViewModel para pasar una colección de Spaces a la Vista, sin embargo, LINQ ya infiere y crea la propiedad Spaces en el modelo de Cliente, por lo que creo que sería más útil usarlo.

¿Me falta algo simple o me estoy acercando a esto incorrectamente?

Gracias!

+0

¿Su vista está fuertemente tipada a 'IEnumerable '? Si no lo es, probablemente sea por eso que no puedes enumerarlo, sin ese pequeño código de ayuda. –

+0

Mi opinión está fuertemente tipada a Inherits = "System.Web.Mvc.ViewPage " Quizás no era lo suficientemente claro, pero la vista proporciona los detalles de la cuenta de un cliente. El cliente tiene cualquier cantidad de espacios que también se deben mostrar en esta página. Así que no quiero solo una lista de espacios, quiero una vista detallada de una cuenta de cliente que incluya los espacios del cliente. –

Respuesta

14

Lo siento si estoy un poco tarde respondiendo esto, pero el método correcto para resolver su problema es agregar una referencia de ensamblado a su archivo web.config para que la vista pueda acceder al método GetEnumerator(). Puede hacerlo utilizando la cadena de referencia de ensamblaje proporcionada en el error de compilación de la página. por ejemplo

<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

+0

Esto funcionó para mí. – Rob

+0

Esto funcionó para mí también, parece tonto que no ocurra de manera predeterminada –

+0

¿Cómo cambiaría esta respuesta dada una aplicación web ASP.Net MVC que utiliza el motor Razor view? – beaudetious

1

Hay dos maneras en que puede hacerlo, aparte de su método de ayuda pequeña.

Puede heredar un IEnumerable de su clase en la página:

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %> 

<% foreach (var item in Model) 
    { 

O puede emitir su objeto de entidad a un IEnumerable:

<% foreach (var item in Model.Spaces as IEnumerable<Space>) 
    { 
+0

Para la primera opción: como mencioné en mi comentario a mi publicación original, no busco simplemente incluir espacios, sino mostrar información detallada de la cuenta del modelo de objetos del Cliente donde el modelo de objetos del Cliente contiene un EntitySet de espacios. Para la segunda opción: Intenté transmitir en la instrucción foreach; sin embargo, aparece el siguiente error: "No se puede convertir implícitamente el tipo 'System.Data.Linq.EntitySet ' en 'object'" - Estoy pensando que usar el enfoque de Ver modelo es el camino a seguir, pero no quiero duplicarme. –

1
  • Primero de todo ello utilizando Visualización de modelos en lugar de acceder directamente a los DTO es preferido. (Uso Automapper para esto)

  • En segundo lugar, Totalmente de escribir sus puntos de vista a Vista del modelo y en la vista del modelo tienen una Lista IEnumerable o se pasa a la vista , entonces se puede iterar a través de él

+0

¿Qué debo hacer para crear el modelo de vista sin duplicar la colección de espacios? Estoy usando el tutorial NerdDinner como plantilla y el ejemplo de un modelo de vista es una clase que toma un modelo de objetos del cliente y también agrega propiedades adicionales para complementar el modelo original que se está transfiriendo. En este caso, terminaría con un EntitySet of Spaces así como una colección separada de IEnumerable . ¿Puede indicarme un recurso que explique la forma correcta de estructurar este modelo de visualización? Gracias! –

+0

La regla de oro es que toda la información que su vista necesita estará en el modelo de vista que pase, por lo que este modelo de vista es uno a medida, y se rellenará con datos de DTO o DTO. En caso de que desee pasar un IEnumerable, el modelo de vista tendrá un IEnumerable en él –

1

Sólo añadir una referencia a System.Data.Linq a su proyecto.

Cuestiones relacionadas