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 :

Parcourir les champs d'un modèle dans une vue en automatique


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut Parcourir les champs d'un modèle dans une vue en automatique
    Bonjour à tous,

    J'aimerais pouvoir parcourir tous les champs de mon modèle en automatique depuis ma vue.
    Je ne dispose pas à l'avance de la liste des champs.

    Dans mon controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public ActionResult Index()
            {
                var vm = new StatistiquesModels();
                vm.prod_cd93_cs8_lad = db.prod_cd93_cs8_lad.ToList();
     
                return View(vm);
            }
        }
    et dans la vue, je peux afficher chaque champs de cette manière:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <table class="table" style="font-size:11px;">
     
                    @foreach (var p in Model.MonModel)
                    {
                        <th>@p.monChamps1</th>                    
                        <th>@p.monChamps2</th>                    
                        <th>@p.monChamps3</th>                    
                        <th>@p.monChamps4</th>
                        <th>@p.monChamps5</th>                    
                         [....]
                    }               
    </table>
    J'aimerais pouvoir récupérer automatiquement la liste de champs ainsi que le nom de champs (afin de faire des traitements de chaînes) et de pouvoir les afficher dans une boucle.

    Merci d'avance de votre aide !

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    google : reflection c# get properties
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Merci de ta réponse,
    J’ai essayé de faire un GetType().GetProperties(), mais je n’arrive à atteindre les valeurs ni le nom.

    Aurais tu un exemple ?
    Merc i d’avance

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    getproperties tout seul ne fonctionne pas, il faut préciser quels types de propriétés on veut
    GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) est le plus courant : les propriétés public non static
    ca retourne une collection de PropertyInfo et sur cette classe il y a .Name, .Propertytype etc...
    il y a aussi .GetValue(une instance) qui permet d'avoir la valeur pour une instance (ca ne devine pas l'instance car le PropertyInfo est lié au type)

    si tu ne veux pas toujours toutes les propriétés tu peux créer un attribut (en faisant un classe héritant de System.Attribute)
    tu peux alors tagger les propriétés utiles avec [MyAttribute] au dessus
    tu peux faire une recherche de propriétés ayant cet attribut

    pour aller plus loin tu peux même faire des attributs qui décrivent un fonctionnement de la propriété pour savoir ensuite comment les traiter (si elle doivent être traitées différement)


    ! : la réflection est assez gourmande en temps d'exécution, pour les propriétés d'une instance ca reste transparent, mais quand on travaille sur une collection assez grande ca plombe réellement (surtout GetValue et SetValue)
    (le level au dessus c'est un expression tree compilé à partir de reflection, c'est aussi pratique et souple que la reflection, avec les performances qu'aurait du code écrit, par contre c'est pas évident à écrire et à relire ^^)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Merci pour toutes ces informations
    Malheureusement, je n'arrive toujours pas à afficher les informations.

    Dans ma vue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     @foreach (System.Reflection.PropertyInfo system in Model.GetType().GetProperties(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod))
    {                    
                             <tr>
                            <th>@system.Name</th>
    </tr>
     
                    }
    J'obtiens le nom des deux propriétés de mon modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class StatistiquesModels
        {
            public List<Modele1> Modele1 { get; set; }
     
            public List<Modele2> Modele { get; set; }
     
     
        }
    Mais j'aimerais récupéré la liste des champs du Modele1 (nom et valeur)

    Merci d'avance de ton aide.

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu demandes les properties sur la classe StatistiquesModels c'est normal qu'il ne te retourne que modele1 et modele
    si tu veux parcourir les collections il manque un foreach dans le foreach
    et si tu veux après faire le tour des propriétés contenu dans les item des collection il faut un autre for each
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Merci de ta réponse.
    Justement je récupère un objet propertyInfo, mais ensuite je ne sais pas sur quoi boucler pour récupérer les informations dont j’ai besoin.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Tu peux nous montrer 2 classes différentes et ce que tu veux afficher dans chaque cas ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    J’ai une classe Info avec 130 propriétés de type string
    {
    Public string info1 {set;get}
    ...
    }

    Dans ma vue, j’ai besoin des deux models info et info_complet.

    J’ai besoin de récupérer les noms et valeurs des 130 propriétés afin de les afficher sous forme de tableau.

    Je ne sais pas si je suis bien claire
    Merci beaucoup

  10. #10
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    voici ma classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public partial class Info1
        {
            public int id { get; set; }
            public Nullable<System.DateTime> checking_datetime { get; set; }
            public string BatchID { get; set; }
            public string Accouchement_AgeGestationnel { get; set; }
            [...]

    Je souhaite récupérer dans ma vue tous les champs de cette classe (Name et value)

    Voici le modèle utilisé dans ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class StatistiquesModels
        {
            public List<info1> info1 { get; set; }
     
            public List<info2> info2{ get; set; }
     
        }

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    inf1 est un string puis une classe puis une collection ... je ne comprends pas trop

    et si tu as 130 propriétés que tu veux lister il aurait été préférable de coder ca autrement je pense, avec une classe qui a une propriété name et une propriété value de type object (qui permet de ranger tout et n'importe quoi dedans) et une collection de cette classe
    ou d'utiliser un dictionary
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Je m'explique:

    J'ai deux tables (alimentées par des programmes externes).

    Une table contient toutes les infos appelé Info1 (que je ne connais pas à l'avance) et dans ce cas elle contient environ 130 champs mais elle pourrait en contenir + ou -.

    classe info1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     public partial class info1
        {
            public int id { get; set; }
            public Nullable<System.DateTime> checking_datetime { get; set; }
            public string BatchID { get; set; }
            public string Accouchement_AgeGestationnel { get; set; }
            [  ...]
    Voici la deuxième classe info2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     public partial class info2
        {
            public int id { get; set; }
            public string Name_Fields { get; set; }
            public Nullable<System.DateTime> Name_Fields_DateCreat { get; set; }
            public Nullable<System.DateTime> Name_Fields_DateFin { get; set; }
            public string Name_Fields_Type { get; set; }
        }
    Dans ma vue "Statistiques" j'ai besoin d'utiliser ces deux classes.

    Voici donc mon modèle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      public class StatistiquesModels
        {
            public List<Info1> Info1{ get; set; }
     
            public List<Info2> Info2{ get; set; }
        }

    J'aimerais dans ma vue pouvoir récupérer la valeur et le nom de chaque champs, j'ai besoin de faire des traitements de chaînes sur les valeurs avant de les afficher (de manière automatique) sur ma vue.

    J'ai testé:
    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
     
    <table class="table" style="font-size:11px;">
     
                    @foreach (var system in Model.prod_cd93_cs8_lad.GetType().GetProperties(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod))
                       {
                        foreach (var j in system.GetType().GetProperties(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod))
                        {
                            foreach (var f in j.PropertyType.Name)
                            {
                                <tr>
                                <th>@f.ToString()</th>
                            </tr>
                            }
                        }
     
                    }
    Mais je n'arrive pas a afficher ces informations.
    Après je débute en Asp.net MVC, ce n'est peut être pas la bonne méthode..

    Merci d'avance de ton aide.

  13. #13
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    déjà tu fais getproperties sur ta collection alors que tu connais son type, c'est list
    donc tu vas récupérer les propriétés de la classe list, et ce n'est pas ce que tu veux

    et en effet je pense qu'il y a un problème de conception
    voir le dictionary ou un autre moyen de stocker tes infos

    mais il faudrait remonter à source du problème
    souvent sur les forums il y a le problème xy, on demande comment faire y pour résoudre son problème x mais y est une mauvaise idée, en expliquant x on peut souvent vous donner une meilleure piste qu'y
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    D’après toi tu ferais comment?

    Merci

  15. #15
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    à la source tu dois pouvoir récupérer les noms des infos, donc tu dois pouvoir les stocker aussi pour ne pas avoir à faire de reflection (quand on peut s'en passer on s'en passe)

    mais on a pas d'infos sur d'où viennent ces données
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Points : 52
    Points
    52
    Par défaut
    Les données viennent d'une base de donnée MYSQL, c'est des tables créées et alimentées par des programmes externes (collecte de données)
    Dans la table Info1 en question, ce sont des champs (que je ne connais pas à l'avance, qui peuvent changer...) chaque champs est un string contenant plusieurs informations (séparé par un séparateur)

    Via un ADO .net entity data model, je charge le model de ma BDD dans le projet.

    J'ai ensuite créé un model StatistiqueModels:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class StatistiquesModels
        {
            public List<info1> info1{ get; set; }
     
            public List<info2> info2{ get; set; }
     
        }
    Info1 et Info2 représente des tables de ma BDD.


    Dans mon controller:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class StatistiquesController : Controller
        {
            private MySQLEntities4 db = new MySQLEntities4();
            // GET: Statistiques
            public ActionResult Index()
            {
                var vm = new StatistiquesModels();
                vm.Info1= db.Info1.ToList();
     
                return View(vm);
            }
        }
    Dans ma vue index, j'aimerais récupérer la liste des champs de Info1 (name et value) afin de les afficher.

    Merci de votre aide

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/08/2009, 17h39
  2. Relier les champs de deux tables dans une interface graphique
    Par laurentlorient dans le forum Débuter
    Réponses: 1
    Dernier message: 26/04/2009, 22h34
  3. Réponses: 2
    Dernier message: 07/08/2007, 19h48
  4. Réponses: 4
    Dernier message: 21/06/2007, 13h33
  5. Récupérer les champs d'un formulaire dans une jsp
    Par lalyly dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/04/2007, 10h50

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