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 :

[MVC3] Héritage de modèles et vue fortement typé


Sujet :

ASP.NET MVC

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [MVC3] Héritage de modèles et vue fortement typé
    Bonjour,

    Dans le cadre d'un site web en ASP MVC 3 et utilisant un mappage avec une base de données via Entity Framework, j'ai voulu faire un héritage de modèles pour factoriser du code, plus concrètement :

    Un modèle Client avec les champs prénom et nom.
    Un modèle Entreprise héritant de Client et ajoutant le champs SIRET.

    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
    49
    50
    51
    52
    53
    54
     
    // Modèles :
     
    class Client {
    public string Prenom { get; set; }
    public string Nom { get; set; }
    }
     
    class Entreprise : Client {
    public string Siret{ get; set; }
    }
     
    ...
     
    // Controlleurs :
     
    class ClientController {
     
    public ActionResult EditClient(int id) {
     
    Client model;
     
    if (..)
    model = new Client();
    else
    model = new Entreprise();
     
    return View(model);
    }
     
    public void EditClient(Client c) {
    if (c is Entreprise)
    ...
    else
    ...
    }
     
    }
     
    // Vue :
     
    @model Client
     
    @Html.EditorFor(m => m.Prenom);
    @Html.EditorFor(m => m.Nom);
     
    @if (Model is Entreprise) {
    @Html.Partial("EntreprisePartial")
    }
     
    // Vue Partielle :
    @model Entreprise
     
    @Html.EditorFor(m => m.Siret)
    Est-il possible d'avoir une unique vue fortement typée et pouvoir juste faire un test dans la vue pour afficher le champ "SIRET" ?

    Parce que pour le moment du côté controller dans la méthode EditClient(Client c), "c" est toujours du type Client.

    Une idée de best-practice plutôt que de devoir faire une vue par type de client ?

    Merci !

  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
    Ca marche pas le bout de code que tu as mis avec @Html.Partial ? Ça me semble une bonne approche...

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Cela fonctionne correctement au niveau de l'affichage, si j'envoie un Client tout cours ça n'affiche pas le SIRET, si c'est une Entreprise ça affiche correctement le SIRET, le problème vient de la soumission quand je reviens dans le Controller dans la méthode EditClient(Client c), je n'obtiens pas d'instance de Entreprise.

  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
    Ah ok, j'avais pas pensé au submit... dans ce cas je pense que tu es un peu obligé de faire des vues distinctes. Par contre, pour la partie commune, tu peux peut-être utiliser une vue partielle (enfin je suis pas sûr, je suis pas du tout expert en MVC...)

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    N'importe comment (MVC ou pas), je ne vois pas comment cela peut marcher. Une classe de base n'a pas accès aux propriétés des classes qui en hérite. Là tu passes un Client pas une Entreprise.

    A la limite, il faut que l'argument soit un interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface IClient
    {
        string Nom { get; set; };
        string Prenom { get; set; };
    }
    Si Client implémente cette interface alors entreprise aussi par l'héritage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void EditClient(IClient c)
    En tout les cas je ne vois aucun lien de parenté entre Entreprise et Client... C'est le nom et le prénom de qui que tu vas mettre??
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Bonjour,

    Le problème dans la récupération des informations dans le contrôleur n'est pas la vue, mais la méthode EditClient(Client c) du contrôleur. Pour que cela fonctionne tu dois créer 2 méthodes de récupération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void EditClient(Client c) {
    ... 
    }
     
    public void EditClient(Entreprise c) {
    ... 
    }
    Et c'est le Framework qui saura, en fonction des données du formulaire (en l'occurrence le n° de SIRET en plus pour l'entreprise) quelle méthode appeler.

    Mais soit dit en passant, je ne pense pas que faire dériver Entreprise de Client soit conceptuellement parlant très heureux, Client représentant apparemment une personne et Entreprise, ben... tout sauf une personne avec un nom et un prénom ...
    "C'est tellement merdique que toute modification est une amélioration !"

Discussions similaires

  1. MVC héritage classe modèle comment le gérer dans la vue
    Par david.catus dans le forum ASP.NET
    Réponses: 0
    Dernier message: 28/12/2014, 18h54
  2. Utilisation du dataset fortement typé
    Par s.n.a.f.u dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 06/04/2007, 19h39
  3. Pb avec un dataset fortement typé
    Par chris81 dans le forum Windows Forms
    Réponses: 14
    Dernier message: 05/03/2007, 14h29
  4. [ADO.net][VB.net] DataSet fortement typé à la main
    Par RaelRiaK dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/01/2007, 09h48
  5. Réponses: 2
    Dernier message: 19/09/2006, 13h26

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