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] Controles dynamiquement créés et model [Débutant(e)]


Sujet :

ASP.NET MVC

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 20
    Points
    20
    Par défaut [MVC3] Controles dynamiquement créés et model
    Bonjour a tous,

    Etant débutant en MVC 3 j'aurais quelquees questions à vous poser concernant un point épineux que je me demande.

    J'ai un formulaire pouvant contenir X champs.

    Ce nombre de champs est défini dynamiquement dans ma base de donnée, cette valeur peut varier.

    La question que je me pose, c'est que si je crée avec une boucle mes controles dans ma vue à partir du résultat de la base, comment je les lie à mon model?
    Ou plutot comment je crée les valeur dynamiquement dans le model?

    Enfin voila je suis assez perdu la.

  2. #2
    Membre régulier
    Avatar de Crooby
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2011
    Messages : 65
    Points : 114
    Points
    114
    Par défaut
    Bonjour,
    Depuis le framework .NET 4 on utiliser le type dynamic pour le Model
    et ainsi retrouver une flexibilité sur le type.

    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    On peut donc lui envoyer n'importe quel type.

    "Two turkeys do not make an eagle" Vic Gundotra

    Projet personnel:
    http://ntracker.codeplex.com/ - Framework d'injection de dépendances
    https://mayhemkinect.codeplex.com/ - Ajout du support de la Kinect pour Mayhem

    Quelque outils sympas:
    http://mayhem.codeplex.com/
    http://makemayhem.com/

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    Merci pour cette réponse rapide,

    malheureusement je ne suis pas sur que ca m'aide, d'une parce que je comprend pas trop comment ca fonctionne, si tu avais un exemple de code avec lequel cet appel fonctionne ca m'aiderais beaucoup.
    Et de deux parce que j'ai oublié de préciser que je suis en VB.net avec le pack razor, oui j'aime la difficulté ^^.

  4. #4
    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,
    Si tu veux avoir une réponse satisfaisante à ton problème, il va falloir être plus précis

    J'ai un formulaire pouvant contenir X champs.

    Ce nombre de champs est défini dynamiquement dans ma base de donnée, cette valeur peut varier.
    Veux-tu dire par là que tu comptes récupérer une collection d'objets (de type ICollection<TypeObjet>, IEnumerable<TypeObjet>, TypeObjet[], etc.) ?

    Ou alors une série de valeurs dynamiques non représentables dans un modèle de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MonModel
    {
        public int MonChamp1 { get; set; }
        public string MonChamp2 { get; set; }
        public DateTime MonChamp3 { get; set; }
        ...
    }
    le nombre de champs variant en fonction de données de la base ?

    Pourrais-tu mettre un exemple de code ?

    Pour ma part, je ne vois pas comment le mot clé dynamic pourrait t'aider, car pour moi, cela sert à déclarer une variable sans présupposer de son type, mais en l'utilisant au final dans le type qui nous intéresse. L'exemple fournit sur wikipedia : http://en.wikipedia.org/wiki/Duck_typing#In_C.23 pourra peut-être t'aider à comprendre.

    Pour finir, je ne connais pas VB.NET (j'ai jeté aux orties dès que j'ai pu tout rapport au VB, c'est ce que j'ai apprécié en passant de ASP à ASP.NET ), mais je pense qu'il doit y avoir l'équivalent voire même depuis la naissance du langage VB.
    "C'est tellement merdique que toute modification est une amélioration !"

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    oui je me doute que j'allais devoir être plus précis, j'aurais aimé mettre un bout de code mais effectivement je ne sais même pas comment m'y prendre alros le bout de code :s.

    je vais faire un exemple:

    ma table s'appelle controls et sarpente comme ceci:
    Id int
    Type nvarchar(10)
    Text nvarchar(50)

    cette table contient des enregistrements de cet ordre:
    1 Text prénom
    2 Text nom
    3 List Sexe

    quand c'est une liste une autre table me donne la liste de choix que je souhaite en rapport avec l'enregistrement.

    Bref, pour faire simple, je souhaite pouvoir mettre ses enregistrements sous forme de controle formulaire.

    Actuellement j'ai réussi à afficher le tout mais quand je valide mon modele ne récupère pas les valeurs qui y sont associé, j'ai créé un htmlhelper pour faciliter l'affichage voici le contenu de mon htmlhelper:
    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
    <System.Runtime.CompilerServices.Extension()> _
            Public Function ListOfFields(Helper As HtmlHelper, ListOfCustomFields As Dictionary(Of Integer,Fields),SelectListForCustomField As Dictionary(Of Integer,selectlist),optional GlobalClass As String="", _
                                                          optional GlobalStyle As String="",optional LabelClass As String="",optional LabelStyle As String="",optional FieldClass As String="",optional FieldStyle As String="") As IHtmlString
    Dim ReturnString As String = ""
                For Each Cntrl In ListOfCustomFields
                    ReturnString += String.Format("<div title='{0}' class='{1}' style='{2}'>", Cntrl.Value.Tooltip, GlobalClass, GlobalStyle)
                    Select Case Cntrl.Value.Type
                        Case "text"
                            Dim textbox As New TextBox
                            ReturnString += "<div class='" & LabelClass & "' style='" & labelStyle & "'>" & _
                            "<label for='ListOfCustomFields_" & Cntrl.Key & "_'>" & Cntrl.Value.Text & "</label>" & _
                            "</div>" & _
                            "<div class='" & FieldClass & "' style='" & FieldStyle & "' >" & _
                            "<input id='ListOfValuesOfCustomFields[" & Cntrl.Key & "]' name='ListOfValuesOfCustomFields[" & Cntrl.Key & "]' type='text' value=''/>" & _
                            "</div>"
     
                        Case "list"
                            ReturnString += "<div class='" & LabelClass & "' style='" & LabelStyle & "'>" & _
                            "<label for='ListOfCustomFields_" & Cntrl.Key & "_'>" & Cntrl.Value.Text & "</label>" & _
                            "</div>" & _
                            "<div class='" & FieldClass & "' style='" & FieldStyle & "'>" & _
                            "<select id='ListOfValuesOfCustomFields[" & Cntrl.Key & "]' name='ListOfValuesOfCustomFields[" & Cntrl.Key & "]'>"
                            For Each Element In (From e In SelectListForCustomField Where e.Key=Cntrl.Key Select e.Value).First
                                ReturnString += String.Format("<option {0} value='{1}'>{2}</option>", IIf(Element.Selected, "selected", ""), Element.Value, Element.Text)
                            Next
                            ReturnString += "</select>" & _
                            "</div>"
                    End Select
                    ReturnString += "</div>"
                Next
                Return New HtmlString(ReturnString)
            End Function
    voici ce que j'ai mis dans mon modèle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Property ListOfCustomFields As New dictionary(of integer,fields)
        Public Property ListOfValuesOfCustomFields As New Dictionary(Of integer,string)
        public Property SelectListForCustomField As new Dictionary(Of Integer,selectlist)
    les liste son complété avant l'affichage sur mon controlleur dans l'actionresult.

    Au final sur le httppost de l'actionresult (quand je valide mon formulaire) il n'a gardé aucune donné de ce que j'ai mis dans mes controles.
    après que vous ayez la réponse en vb ou en C# je m'en fous, je traduit de l'un à l'autre sans aucun soucis, mais une réponse m'aiderais bcp la .

  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
    Tout d'abord, le modèle de récupération n'a pas besoin d'être le même que le modèle d'affichage.
    Tu peux donc faire 2 modèles, un contenant ListOfCustomFields et SelectListForCustomField pour l'affichage et un autre avec ListOfValuesOfCustomFields pour la récupération.

    Mais l'important c'est d'avoir un modèle de récupération conforme. En l'occurrence, j'ai l'impression que le "moteur de remplissage" du modèle n'apprécie pas trop le Dictionary<int, string> (c'est peut-être juste un problème de syntaxe dans le "name" des champs input, mais là je n'en sait pas plus). Toujours est-il qu'en déclarant ListOfValuesOfCustomFields de type IEnumerable<string> (ou string[]), ça devrait marcher, en prenant bien soin de commencer les index à 0.

    En gros, il faut que le formulaire HTML soit du genre (à adapter suivant tes besoins évidemment) :
    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
    @using (Html.BeginForm())
    {
        <div>
            <label for='ListOfValuesOfCustomFields[0]'>
                Prénom</label></div>
        <div>
            <input id='ListOfValuesOfCustomFields[0]' name='ListOfValuesOfCustomFields[0]' type='text'
                value='' /></div>
     
        <div>
            <label for='ListOfValuesOfCustomFields[1]'>
                Nom</label></div>
        <div>
            <input id='ListOfValuesOfCustomFields[1]' name='ListOfValuesOfCustomFields[1]' type='text'
                value='' /></div>
     
        <div>
            <label for='ListOfValuesOfCustomFields[2]'>
                Sexe</label></div>
        <div>
            <input id='ListOfValuesOfCustomFields[2]' name='ListOfValuesOfCustomFields[2]' type='text'
                value='' /></div>
        <p>
            <input type="submit" value="Envoyer" />
        </p>
    }
    Et le modèle de récup' (en C#, désolé mais moi, le VB...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public class TestModels
        {
            public IEnumerable<string> ListOfValuesOfCustomFields { get; set; }
        }
    "C'est tellement merdique que toute modification est une amélioration !"

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 26
    Points : 20
    Points
    20
    Par défaut
    merci bcp de ta réponse,

    Même si j'ai réussi a trouver entre temps, mon problème venait principalement de mon htmlhelper "perso".

    Je suis passé directement par le formatage de la view et sa marche très bien .

    par contre ton code va m'aider par ce que je ne savais pas trop comment faire pour utilsier un labelfor dans un htmlhelper perso mais si on peux le formater comme tu me l'a montré, je pense que je peux le faire avec un htmlhelper perso.

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

Discussions similaires

  1. [VB6]comment supprimer dynamiquement un controle dynamique?
    Par totor le troll dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/07/2011, 21h10
  2. [VB.NET] Contrôle dynamique et évènements
    Par johann.C dans le forum ASP.NET
    Réponses: 4
    Dernier message: 30/11/2009, 10h45
  3. Réponses: 1
    Dernier message: 03/04/2007, 21h27
  4. [C#]control dynamique
    Par inferno dans le forum ASP.NET
    Réponses: 5
    Dernier message: 25/08/2006, 12h08
  5. [VB6] creation et gestion de contrôle dynamique
    Par olivierx dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 23/04/2004, 00h09

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