IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Faire remonter un type du modèle à la vue


Sujet :

ASP.NET MVC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Faire remonter un type du modèle à la vue
    Bonjour,

    Débutant un projet MVC pour la première fois, je suis confronter a un petit problème. En utilisant LINQ to Entities, je récupère certaines information via une double jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from ip in dataContext.Instances_Projet
    join pro in dataContext.Projets on ip.ID_Projet equals pro.ID_Projet
    join etat in dataContext.Etats_Instance on ip.ID_Etat_Instance equals etat.ID_Etat_Instance
    select new { ip.ID_Instance, pro.Titre, etat.Libelle}
    Cette requète est comprise dans une méthode statique d'une classe de modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static IQueryable<object> GetInstance()
            {
                SPEntities dataContext = new SPEntities();
                var listeinstance = (from ip in dataContext.Instances_Projet
                                   join pro in dataContext.Projets on ip.ID_Projet equals pro.ID_Projet
                                   join etat in dataContext.Etats_Instance on ip.ID_Etat_Instance equals etat.ID_Etat_Instance
                                   select new { ip.ID_Instance, pro.Titre, etat.Libelle });
                return listeinstance;
            }
    Cette méthode est appelé dans mon controlleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public ActionResult Index()
            {
                return View(ProjetsModels.GetInstance());
            }
    et j'essaye de récupérer les infos dans ma vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        <% foreach (var item in (IEnumerable)ViewData.Model)
           { %>
     
            <tr>
                <td>
                    <%= Html.Encode(item.ID_Instance)%>
                </td>
            </tr>
     
        <% } %>
    Le problème est que je n'arrive pas à accéder au données dans ma vue

    Je pense que le problème vien du fait que je n'arrive pas a remonter le type de mon objet.

    Quelqu'un a t il une solution ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Un type anonyme ne peut pas être utilisé en dehors de la méthode où il est déclaré... Certes, tu peux renvoyer "object" à la place, mais dans ce cas tu perds les informations de type, et tu ne peux donc plus accéder aux membres de l'objet. Il faut que tu crées une classe pour représenter les résultats de ta requête, et tu l'utilises à la place du type anonyme

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    je viens d'essayer, mais je doit encore me tromper quelque part ca ne fonctionne pas !
    j'ai don sur vos conseil rajouter une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
            public class ListeInstance
            {
                public long ID_Instance;
                public string Titre;
                public string Libelle;
            }
            public static IQueryable<ListeInstance> GetInstance()
            {
                SPEntities dataContext = new SPEntities();
                var listeinstance = (from ip in dataContext.Instances_Projet
                                     join pro in dataContext.Projets on ip.ID_Projet equals pro.ID_Projet
                                     join etat in dataContext.Etats_Instance on ip.ID_Etat_Instance equals etat.ID_Etat_Instance
                                     select new { ip.ID_Instance, pro.Titre, etat.Libelle });
     
                return (IQueryable<ListeInstance>)listeinstance;
            }
    visual ne me souligne aucune erreur mais l'execution m'en sort une :

    Impossible d'effectuer un cast d'un objet de type 'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType2`3[System.Int64,System.String,System.String]]' en type 'System.Linq.IQueryable`1[SP.Models.ProjetsModels+ListeInstance]'.
    J'ai essayer de retourner le problème dans plusieurs sens (pas tous visiblement) mais je n'arrive toujours pas au résultat escompté

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Bah tu essaies de convertir un IQueryable<TypeAnonyme> en IQueryable<ListeInstance>, donc forcément ça marche pas...

    L'instruction qui crée l'objet de type anonyme est celle là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select new { ip.ID_Instance, pro.Titre, etat.Libelle }
    Il faut faire à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select new ListeInstance { ip.ID_Instance, pro.Titre, etat.Libelle }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai essayer ta solution mais VS me souligne la première accolade de déclaration en me demandant d'implémenter IEnumerable
    Erreur 1 Impossible d'initialiser un type 'SP.Models.ProjetsModels.ListeInstance' avec un initialiseur de collection, car il n'implémente pas 'System.Collections.IEnumerable'
    j'ai donc essayer mais je ne sais pas quoi mettre dans getenumerator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public partial class ListeInstance : IEnumerable
            {
                public long ID_Instance;
                public string Titre;
                public string Libelle;
     
     
     
                public IEnumerator GetEnumerator()
                {
                    throw new NotImplementedException();
                }
            }
    De plus, quand je le fait, il me souligne individuellement mes trois propriétés (ip.ID_Instance, pro.Titre, etat.Libelle) et me disant :
    Erreur 1 'SP.Models.ProjetsModels.ListeInstance' ne contient pas de définition pour 'Add'

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par scipio2501 Voir le message
    J'ai essayer ta solution mais VS me souligne la première accolade de déclaration en me demandant d'implémenter IEnumerable (Erreur 1 Impossible d'initialiser un type 'SP.Models.ProjetsModels.ListeInstance' avec un initialiseur de collection, car il n'implémente pas 'System.Collections.IEnumerable' )
    Le message d'erreur du compilateur est foireux, c'est pas ça la cause de l'erreur... je me suis planté dans le code que je t'ai donné, en fait c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select new ListeInstance
    {
        ID_Instance = ip.ID_Instance,
        Titre = pro.Titre,
        Libelle = etat.Libelle
    }

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci, mes couches fonctionnent maintenant comme un horloge bien huilé !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/12/2006, 21h58
  2. Réponses: 1
    Dernier message: 09/11/2006, 12h39
  3. Faire "remonter" les données dans des requetes imbriquées
    Par Earthwormjim dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/08/2006, 17h37
  4. Réponses: 17
    Dernier message: 04/02/2005, 12h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo