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 :

RuntimeBinderException à l'exécution [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 51
    Points : 115
    Points
    115
    Par défaut RuntimeBinderException à l'exécution
    Bonjour,

    Dans mon projet MVC, je veux afficher les détails d'une entité créée à la volée (via la clause join dans Linq to SQL). Ci-dessous, le bout de code de mon contrôleur.

    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
    17
    18
    19
    20
     
    public ActionResult Details(int id)
    {
        var details = (from c in _entities.contact
                           join t in _entities.titre on c.titr_id equals t.titr_id
                           join a in _entities.adresse on c.adre_id equals a.adre_id
                           join v in _entities.ville on a.vill_id equals v.vill_id
                           where c.cont_id == id
                           select new
                           {
                               t.titr_nom, c.cont_nom, c.cont_prenom,
                               a.adre_champs1,
                               a.adre_champs2,
                               a.adre_champs3,
                               v.vill_code_postal, v.vill_nom,
                               c.cont_tel, c.cont_portable,
                               c.cont_email
                           }).FirstOrDefault();
        return View(details);
    }
    Puis j'utilise mes données dans ma vue. Ci-dessous, une partie de mon bout de code de ma vue (qui est un peu longue).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h1>Détails de <%= Html.Encode(Model.cont_prenom) %> <%= Html.Encode(Model.cont_nom) %></h1>
    Il ne me semble pas avoir fait d'erreur mais malheureusement à l'exécution une RuntimeBinderException est levée. Si quelqu'un a une idée, merci d'avance.

    Rérou

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Je pense que cela ne fonctionne parce que tout simplement tu essaies d'accéder au modèle d'après <h1>Détails de <%= Html.Encode(Model.cont_prenom) %> <%= Html.Encode(Model.cont_nom) %></h1> alors que ta vue n'est pas typée. Comment je le sais ? Bah tu lui passes une collection de type anonyme.

    Essaies d'utiliser une ViewModel si dans ton modèle il n'y a aucune classe qui pourrait remplacer le type anonyme. Une fois la classe ViewModel créée alors tu l'utilises pour ta vue.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 51
    Points : 115
    Points
    115
    Par défaut
    Ce qui est bizarre c'est que quand j'ai fait mon 1er test ça a fonctionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var détails = (from c in _entities.contact
                       where c.cont_id = id
                       select c).FirstOrDefault();
    Peut-être parce qu'il le typait correctement dans la vue, je ne sais pas.

    En tout cas j'ai eu une réponse sur le chat. Cette réponse est très farfelue mais a le mérite d'exister.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    public ActionResult Details(int id)
            {
                saison saison = (from s in _entities.saison
                                 orderby s.sais_annee descending
                                 select s).FirstOrDefault();
     
                var details = from c in _entities.contact
                              join t in _entities.titre on c.titr_id equals t.titr_id
                              join a in _entities.adresse on c.adre_id equals a.adre_id
                              join v in _entities.ville on a.vill_id equals v.vill_id
                              join e in _entities.est_adherent on c.cont_id equals e.cont_id
                              join asso in _entities.association on e.asso_id equals asso.asso_id
                              where c.cont_id == id && saison.sais_id == e.sais_id
                              select new
                              {
                                  titr_nom = t.titr_nom,
                                  cont_nom = c.cont_nom,
                                  cont_prenom = c.cont_prenom,
                                  adre_champs1 = a.adre_champs1,
                                  adre_champs2 = a.adre_champs2,
                                  adre_champs3 = a.adre_champs3,
                                  vill_code_postal = v.vill_code_postal,
                                  vill_nom = v.vill_nom,
                                  cont_tel = c.cont_tel,
                                  cont_portable = c.cont_portable,
                                  cont_email = c.cont_email,
                                  asso_nom = asso.asso_nom,
                                  esta_est_abonne = e.esta_est_abonne,
                                  esta_num_abonne = e.esta_num_abonne,
                                  esta_num_adherent = e.esta_num_adherent
                              };
                return View(details);
            }
    Et dans ma vue.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <%  int i = 0;
                foreach (var item in Model)
                {
                    if (i == 0)
                    { %>
                        <h1>Détails de
                            <%= Html.Encode(item.GetType().GetProperty("cont_prenom").GetValue(item, null)) %>
                            <%= Html.Encode(item.GetType().GetProperty("cont_nom").GetValue(item, null)) %>
                        </h1>
                        <div class="paragraphe">
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("titr_nom").GetValue(item, null))%>
                                <%= Html.Encode(item.GetType().GetProperty("cont_nom").GetValue(item, null))%>
                                <%= Html.Encode(item.GetType().GetProperty("cont_prenom").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("adre_champs1").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("adre_champs2").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("adre_champs3").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("vill_code_postal").GetValue(item, null))%>
                                <%= Html.Encode(item.GetType().GetProperty("vill_nom").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("cont_tel").GetValue(item, null))%>
                                <%= Html.Encode(item.GetType().GetProperty("cont_portable").GetValue(item, null))%>
                            </p>
                            <p>
                                <%= Html.Encode(item.GetType().GetProperty("cont_email").GetValue(item, null))%>
                            </p>
                            Est adhérent de :
                            <ul>
                    <% } %>
                        <li>
                            <%= Html.Encode(item.GetType().GetProperty("asso_nom").GetValue(item, null))%>
                        </li>
                    <% if (i == 0)
                       { %>
                        </ul>
                    <% } %>
                </div>
            <% } %>
    En tout cas merci d'avoir pris le temps de regarder mon problème, je passe la discussion à "résolu" mais si quelqu'un a une méthode plus propre je suis preneur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Evidemment qu'à un problème plusieurs solutions peuvent exister surtout en programmation informatique. Certaines solutions sont performantes, d'autres non. Certaines respectent les bonnes pratiques et d'autres non.

    La solution que tu as implémentée ne respecte aucunement les bonnes pratiques et surtout elle n'est pas performante vu que tu passes par le réflexion (c'est l'introspection des métadonnées).

    Bref la solution d'une ViewModel est la meilleure si tu ne veux pas passer par une classe de ton modèle.

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

Discussions similaires

  1. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  2. [TTHREAD] ne termine pas sont exécution
    Par Bbenj dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2002, 16h42
  3. Exécution indivisible (accès conccurent)
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 23/07/2002, 08h09
  4. Compression d'exécutables
    Par Atrebate62 dans le forum Windows
    Réponses: 3
    Dernier message: 21/07/2002, 16h39
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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