2011-04-21 31 views
5

Estoy usando dos objetos DataContext para devolver conjuntos de datos AsQueriable() separados y luego unir los dos usando linq. La construcción de datos funciona perfectamente, sin embargo, cuando paso ese conjunto combinado de datos a la vista, obtengo el error 'objeto' que no contiene una definición para 'Nombre'.'objeto' no contiene una definición para 'Nombre'

Durante una sesión de depuración, puedo ver claramente que tanto el Modelo padre como cada 'elemento' en el ciclo foreach tienen todos los datos y claves visibles/accesibles. Estoy muy confundido.

Muchos de los otros q & a's en stackoverflow.com que coinciden con este problema no resuelven mi problema y, como resultado, agradecerían un nuevo par de ojos y, con suerte, una solución a este problema.

¡Muchas gracias! - tiempo de código:

La construcción datos

 public ActionResult SplashImages() 
     { 
      var g = (from i in GetGallerySplash() join o in GetFestivals() on i.Festival equals o.ID orderby i.Rating descending select new {i.Photo, i.OwnedBy, i.Rating, o.Name }); 
      Response.ContentType = "text/xml"; 
      return View(g); 
     } 

     private IEnumerable<Gallery> GetGallerySplash() 
     { 
      GallerysDataContext gdc = new GallerysDataContext(); 
      return (from i in gdc.Galleries orderby i.Rating descending select i).Take(15).AsQueryable(); 
     } 

     private IEnumerable<Festival> GetFestivals() 
     { 
      FestivalsDataContext fdc = new FestivalsDataContext(); 
      return (from i in fdc.Festivals select i).AsQueryable(); 
     } 

pantalla de error de VSExpress: Exception screenshot

Cualquier orientación sobre una solución sería muy apreciada. ¡Gracias!

C

+0

posible duplicado de [Acceso a C# Objetos de tipo anónimo] (http://stackoverflow.com/questions/713521/accessing-c-sharp-anonymous-type-objects) – nawfal

Respuesta

4

Sugiero que cree un único modelo para encapsular ambos objetos IEnumerable, p.

public class GalleryModel 
{ 
    public IEnumerable<Gallery> Galleries { get; set } 
    public IEnumerable<Festivals> Festivals { get; set; } 
} 

A continuación, escriba fuertemente su punto de vista para que coincida con el modelo

...Inherits="System.Web.Mvc.ViewPage<GalleryModel>" 

Luego, en su modelo, puede escribir de forma segura-referirse a cada objeto, por ejemplo,

<% foreach (var t in Model.Galleries) ... 
+0

Gracias Tobias86, estaba a punto de terminar este enfoque exacto cuando vi su respuesta.Tienes razón, por supuesto. Hice un nuevo modelo para los conjuntos de datos combinados y ahora la página funciona perfectamente. ¡Muchas gracias! –

+1

Me alegra ser de ayuda. Hemos tenido que lidiar con escenarios similares, así que he estado donde has estado :) – tobias86

+1

Creo que esto se llama el patrón de diseño ** MVVM ** ('Model View ViewModel'). Básicamente, agrega otra capa entre su Modelo y Vista, un ViewModel, que le permite encapsular mejor su modelo en un formato más amigable para la vista. Muchas personas que usan el patrón MVVM agregan otra carpeta llamada 'ViewModels' a su proyecto, emulan el uso de las carpetas Model, View y Controller, y colocan todas sus clases ViewModel dentro. –

-1

Intente cambiar su bucle for para:

<% foreach (dynamic t in Model) { %> 

El uso de var está causando el tipo de t debe inferirse como object.

+2

si 'Model' no es' IEnumerable 'i preferiría ir a una versión estática y escribir un poco ... ¡'dinámico' es básicamente puro reflejo! –

+0

Hola, Matthew, he aplicado ese cambio lamentablemente sigo teniendo el mismo error. –

+0

el problema es que el tipo anónimo no escapará al alcance del método de acción y la vista solo conoce el Modelo como tipo de objeto. –

Cuestiones relacionadas