1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 16
    Points : 15
    Points
    15

    Par défaut MVC : mapping automatique d'un objet suite à POST HTTP

    Bonjour,

    Je m'auto-forme à ASP.NET / C# / MVC et je butte sur un problème de conception, certainement dû à mon manque d'expérience en objet.

    Je schématise en reprenant les traditionnels exemples :
    - Une classe Animal
    - Une classe Pintade et une classe Canard, héritant toutes les deux d'Animal

    J'ai également une classe "Listes" dans laquelle j'ai juste défini un enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public class Listes
        {
            public enum ListeTypeAnimal
            {
                Pintade,
                Canard
            }
        }
    J'ai un formulaire Web qui est récupéré par une méthode [HttpPost] Index() du 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
     
    [HttpPost]
     public ActionResult Index(Animal unAnimal,ListeTypeAnimal listeTypeAnimal)
            {
                Animal cetAnimal = new Animal();
     
                switch (listeTypeAnimal)
                {
                    case Listes.ListeTypeAnimal.Pintade:
                        cetAnimal = (Pintade)unAnimal;
                        break;
                    case Listes.ListeTypeAnimal.Canard:
                        cetAnimal = (Canard)unAnimal;
                        break;
                }
    Vous l'aurez peut-être compris, je cherche à créer un objet "Pintade" ou "Canard" selon ce que le formulaire web contient dans un champ nommé "listeTypeAnimal" (généré par un @Html.EnumDropDownListFor)

    Je n'arrive pas à trouver la bonne articulation entre les différents éléments, dans l'exemple ci-dessus j'obtiens une erreur de cast, j'ai fait d'autres tentatives, tout aussi infructueuses.

    Auriez-vous une suggestion, une meilleure pratique à adopter ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    novembre 2003
    Messages
    748
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2003
    Messages : 748
    Points : 1 032
    Points
    1 032

    Par défaut

    Salut,

    si coté client tu sais que tu vas créer un canard ou une pintade alors utilise une action approprié en fonction...(donc dans ton cas, 2 actions)
    De plus, le code sera beaucoup plus compréhensible à lire.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 16
    Points : 15
    Points
    15

    Par défaut

    Citation Envoyé par Dokho1000 Voir le message
    si coté client tu sais que tu vas créer un canard ou une pintade alors utilise une action approprié en fonction...(donc dans ton cas, 2 actions)
    De plus, le code sera beaucoup plus compréhensible à lire.
    Merci Dokho1000 pour ta réponse, mais j'ai peur qu'elle ne m'aide pas beaucoup, j'ai peut être mal expliqué le problème.

    Ici, ce que je cherche à faire, c'est instancier un objet différent selon le choix de l'utilisateur dans la vue. J'ai écrit un exemple avec 2 classes héritées, mais on peut imaginer que ma liste comprenne 10 ou 15 classes/types d'animaux différents.

    Dans ce cas, je ne pense pas qu'écrire 15 actions différentes dans le contrôleur soit judicieux.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    novembre 2003
    Messages
    748
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2003
    Messages : 748
    Points : 1 032
    Points
    1 032

    Par défaut

    Tu devras créer ton propre "binder" je pense. (http://www.dotnetcurry.com/aspnet-mv...der-aspnet-mvc)

  5. #5
    Rédacteur/Modérateur

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    1 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 1 456
    Points : 4 864
    Points
    4 864
    Billets dans le blog
    5

    Par défaut

    Bonjour,

    Comme le propose Dokho1000, écrire un binder me semble la meilleure approche.

    Une autre possibilité est d'instancier toi-même l'objet, afin qu'il soit de la bonne classe. Car ce qui se passe actuellement, c'est que c'est le framework MVC qui se charge de l'instanciation. Bête et discipliné, si la signature de ton action contient un paramètre de type Animal, il instancie un Animal. Il ne peut faire autrement (sauf avec un binder écrit par tes soins). Il est donc tout à fait normal que le cast d'un animal en une classe dérivée ne fonctionne pas.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2011
    Messages : 16
    Points : 15
    Points
    15

    Par défaut

    Merci pour vos réponses, je vais remettre à plus tard l'idée de créer mon propre "binder", pas encore à ma portée je pense.

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

Discussions similaires

  1. gros formulaire ? objet ou post?
    Par ozzmax dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 21/09/2006, 21h26
  2. [mapping] composite key et objet en même temps
    Par septentryon01 dans le forum Hibernate
    Réponses: 5
    Dernier message: 21/09/2006, 15h15
  3. Elargissement automatique de l'objet SELECT dans IE
    Par djamonag dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/05/2006, 13h01
  4. Renvoyer un PDF suite à POST dans IE
    Par hagar dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/03/2006, 17h44
  5. [EJB2.1 Entity] [BES] Mapping automatique et clés étrangères
    Par Bobby McGee dans le forum Java EE
    Réponses: 3
    Dernier message: 15/10/2003, 11h33

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