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 :

Envoyer une liste dans un formulaire


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 46
    Points : 32
    Points
    32
    Par défaut Envoyer une liste dans un formulaire
    Bonjour.

    Ci-dessous mon code c# correspondant à mon modèle:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class LivrePapier
        {
            public string Titre { get; set; }
            public float Prix { get; set; }
            public int IdLivre { get; set; }
            public List<Format> Formats { get; set; }
        }
        public class Format
        {
            public int Id { get; set; }
            public string Label { get; set; }
            public bool? Selected { get; set; }
            public string Description { get; set; }
        }

    Ci-dessous mon code c# correspondant à mon controller "GestionLivreController.cs":
    Code C# : 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
     public ActionResult Index()
            {
                        LivrePapier livpaper = new LivrePapier();
                        List<Format> listform = new List<Format>();
                        Format One = new Format();
                        Format Two = new Format();
                        Format Three = new Format();
                         One.Label = "Test1";
                         One.Description = "1Test";
    			One.Selected = true;
    		     Two.Label = "Test2";
                         Two.Description = "2Test";
    			Two.Selected = false;
    		    Three.Label = "Test3";
                         Three.Description = "3Test";
                               Three.Selected = true;
    		listform.Add(One);
    		listform.Add(Two);
    		listform.Add(Three);
    livpaper.Titre = "Tests";
    livpaper.Prix = "2";
    livpaper.Formats = listform;
    return PartialView("vuedeschoix", livpaper);
                                }
     
      public JsonResult Save(LivrePapier data)
            {
                //code de traitement
    	return Json(new { message = "Enregistrement terminé"});
    	}

    Ci-dessous mon code cshtml (razor) correspondant à ma vue "vuedeschoix.cshtml":
    Code cshtml : 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
    @model namespace.LivrePapier
      @using (Html.BeginForm("Save", "GestionLivre"))
     {
         @Html.ValidationSummary(true)
     <table>
     <tr>
     <th>Exemple</th>
     <th>Sélectionner le format</th>
     <th>Autre Test</th>
     </tr>
             <tr>
                <td>Exemple1</td>
                <td>
                   @Html.CheckBoxFor(m => m.listform.Find(x => x.Label.Contains("Test1")).Selected)</td>
                <td>
                    @Html.TextBoxFor(m => m.listform.Find(x => x.Description.Contains("1Test")).Description)
               </td>
               </tr>
              <tr>
                <td>Exemple2</td>
                <td>
                   @Html.CheckBoxFor(m => m.listform.Find(x => x.Label.Contains("Test2")).Selected)</td>
                <td>
                    @Html.TextBoxFor(m => m.listform.Find(x => x.Description.Contains("2Test")).Description)
               </td>
               </tr>
    <tr>
                <td>Exemple3</td>
                <td>
                   @Html.CheckBoxFor(m => m.listform.Find(x => x.Label.Contains("Test3")).Selected)</td>
                <td>
                    @Html.TextBoxFor(m => m.listform.Find(x => x.Description.Contains("3Test")).Description)
               </td></tr>
    </table>
    <input type="submit" value="Créer" />
    <input type="reset" value="Annuler" />
         }

    Or, quand je clique sur le bouton "Créer" pour envoyer le formulaire, je constate (en mode debug) que l'argument 'data' (de type LivrePapier) de la méthode Save du controller contient une liste vide pour la liste Formats (List<Format>).
    Pourtant la liste 'listform' a bien été utilisé.

    Pourriez-vous, s'il vous plait, m'aider à résoudre ce problème?

    Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Points : 647
    Points
    647
    Par défaut
    Salut,

    Le plus gros souci avec la gestion des données en List<>() avec ASP.NET MVC est le mauvais rendu HTML des balises ...

    Tu peux reconstruire tes objets "à la main" (sans l'utilisation des Helper MVC, ou sans les helper de type Html.InputFor() mais Html.Input() ou Html.Textbox() ... etc ) pour que lors du "POST" les données soient envoyées dans un format que le moteur MVC sera capable de convertir en collection d'objet

    Dans ton exemple, si tu veux récupérer les "Formats" de ton type "LivrePapier", tu dois déclarer tes composants html de cette manière (avec la propriété "name" et "id" HTML)

    <input type="hidden" name="Formats[x].Id" id="Formats[x].Id" value="@Formats[x].Id" />
    <input .... name="Formats[x].Label" id="Formats[x].Label" ... />
    etc..

    En partant du principe que "x" commence à 0, et est nécessaire incrémenté de 1 à chaque nouvel objet de ta collection.

    Ainsi, quand tu posteras ton "model" (LivrePapier), tu récupères en théorie des données dans "Formats"

  3. #3
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut EditorTemplate
    Salut,

    Ce que tu demandes est très simple.

    Tu crées :
    1 editor template pour la classe LivrePapier et tu le nommes LivrePapier.cshtml
    1 editor template pour la classe Format et tu le nommes Format.cshtml

    Ils doivent être dans le dossier /Shared/EditorTempates

    LivrePapier.cshtml

    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
     
    @model = LivrePapier
    <ul>
    <li>
    @LabelFor(m => m.Titre)
    @EditorFor(m => m.Titre)
    </li>
    <li>....</li>
    <li>
    @LabelFor(m => m.Formats)
    <ul>
    @EditorFor(m => m.Formats)
    </ul>
    </li>
    </ul>
    Format.cshtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @model = Format
    <li>
    <ul>
    <li>@EditorFor(m = > m.Label></li>
    <li>...</li>
    <li>...</li>
    <li>...</li>
    </ul>
    </li>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Vue :
    @Ajax.Form.... {
    @EditorFor(m => m.LivrePapier)
    }
    Attention, il faut que le nom des EditorTemplates soit exactement le même que la classe à laquelle il correspond (sinon, il faut le spécifier dans les paramètres du Helper).

Discussions similaires

  1. [AC-2013] Afficher une liste dans un formulaire continu
    Par Bragon12 dans le forum IHM
    Réponses: 1
    Dernier message: 05/07/2013, 17h34
  2. [FORMULAIRE]Tri sur une liste dans un formulaire Access
    Par roidesizzets dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/06/2009, 12h35
  3. Actualiser une liste dans un formulaire
    Par lemoineeric dans le forum IHM
    Réponses: 6
    Dernier message: 21/01/2008, 14h31
  4. Filtre d'une liste dans un formulaire
    Par ZZM61 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/01/2008, 16h50
  5. Critère de requête avec une zone de liste dans un formulaire
    Par Dehez dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2006, 12h49

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