2011-04-21 5 views
5

J'utilise deux objets DataContext pour renvoyer des ensembles de données AsQueriable() séparés, puis je joins les deux en utilisant linq. La construction de données fonctionne parfaitement mais quand je passe ce jeu de données combiné à la vue, je reçois l'erreur 'objet' ne contient pas de définition pour 'Name'.'objet' ne contient pas de définition pour 'Nom'

Au cours d'une session de débogage, je peux clairement voir que le modèle parent et chaque 'élément' dans la boucle foreach ont toutes les données et les clés visibles/accessibles. Je suis très confus.

Beaucoup des autres q & sur stackoverflow.com qui correspondent à ce problème ne résolvent pas mon problème et par conséquent apprécieraient un nouvel ensemble d'yeux et j'espère une solution à ce problème.

Merci beaucoup! - Temps de code:

La construction de données

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

écran d'erreur de VSExpress: Exception screenshot

serait grandement apprécié Toute orientation sur une solution. Je vous remercie!

C

+0

duplication possible de [Accès aux objets de type anonyme C#] (http://stackoverflow.com/questions/713521/accessing-c-sharp-anonymous-type-objects) – nawfal

Répondre

4

Je vous suggère de créer un modèle unique pour encapsuler les deux objets IEnumerable, par ex.

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

alors fortement taper vue pour correspondre au modèle

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

Ensuite, dans votre modèle, vous pouvez taper en toute sécurité, reportez-vous à chaque objet, par exemple

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

Grâce à Tobias86, j'étais sur le point de terminer cette approche exacte lorsque j'ai vu votre réponse.Vous avez parfaitement raison, bien sûr. J'ai fait un nouveau modèle pour les ensembles de données combinés et maintenant la page fonctionne parfaitement. Merci beaucoup! –

+1

Heureux d'être utile. Nous avons dû faire face à des scénarios similaires, donc j'ai été là où vous avez été :) – tobias86

+1

Je crois que cela s'appelle le modèle de conception ** MVVM ** (Model View ViewModel). Fondamentalement, vous ajoutez un autre calque entre votre modèle et View - un ViewModel - vous permettant de mieux encapsuler votre modèle dans un format plus convivial. Beaucoup de personnes qui utilisent le modèle MVVM ajoutent un autre dossier appelé 'ViewModels' à leur projet, émulant l'utilisation des dossiers Model, View et Controller, et placent toutes leurs classes ViewModel à l'intérieur. –

-1

Essayez de changer votre boucle à:

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

L'utilisation de var est à l'origine du type de t à déduire que object.

+2

si 'Model' n'est pas' IEnumerable 'i préfère aller pour une version statique typée et introduire un poco ... 'dynamic' est fondamentalement pure réflexion! –

+0

Salut Matthew, j'ai appliqué ce changement malheureusement, j'ai toujours la même erreur. –

+0

Le problème est que le type anonyme n'échappe pas à la portée de la méthode d'action et que la vue ne connaît que l'objet Modèle en tant que type. –

Questions connexes