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 :

[3.2] Impossible de récupérer automatiquement le détail lors d'un post entete détail


Sujet :

ASP.NET MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [3.2] Impossible de récupérer automatiquement le détail lors d'un post entete détail
    Salut,

    Je n'arrive plus à reproduire un comportement qui fonctionnait très bien en [3.0].

    J'ai modèle qui contient une liste de sous élements.
    Lorsque je submit le tout, je vois bien que tous les champs sont envoyés (en regardant dans le Request.Form) mais MVC n'arrive plus à reconstruire ma liste avec les valeurs des lignes de détail.

    Je n'arrive pas à comprendre, j'ai peur que ça vienne de la nouvelle version de MVC.

    Pourriez-vous m'aider ?

    Les modèles :

    La classe DetailRow:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ComponentModel.DataAnnotations;
     
    namespace MVC_HeaderDetailsTester.Models
    {
        public class DetailRow
        {
            [Display(Name = "N° d'évènnement")]
            public int Id { get; set; }
            [Display(Name = "Date évènnement"), DisplayFormat(ApplyFormatInEditMode = false, ConvertEmptyStringToNull = true, DataFormatString = "{dd/MM/yyyy}")]
            public DateTime EventDate { get; set; }
            [Display(Name = "Description")]
            public string Description { get; set; }
            [Display(Name = "Contrôlé")]
            public bool Checked { get; set; }
        }
    }
    La classe Header :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
     
    namespace MVC_HeaderDetailsTester.Models
    {
        public class Header
        {
            [Display(Name="N°")]
            public int Id { get; set; }
            [Display(Name = "Nom")]
            public string Name { get; set; }
            [Display(Name = "Historique")]
            public List<DetailRow> DetailRows { get; set; }
     
            public Header() {
                this.DetailRows = new List<DetailRow>();
            }
        }
    }
    HomeController
    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
    55
    56
    57
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using MVC_HeaderDetailsTester.Models;
     
    namespace MVC_HeaderDetailsTester.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                Header ContentData = new Header()
                    {
                        Id = 1,
                        Name = "Fred",
                        DetailRows = (
                            new DetailRow[] { 
                                new DetailRow() 
                                    { 
                                        Id=1, 
                                        EventDate=new DateTime(2012,01,10), 
                                        Description = "Event 3", 
                                        Checked = true
                                    },
                                new DetailRow() 
                                    { 
                                        Id=2, 
                                        EventDate=new DateTime(2012,01,08), 
                                        Description = "Event 2", 
                                        Checked = false
                                    },
                                new DetailRow() 
                                    { 
                                        Id=1, 
                                        EventDate=new DateTime(2012,01,8), 
                                        Description = "Event 1", 
                                        Checked = false
                                    }
                            }
                        ).ToList()
                    };
                return View(ContentData);
            }
            [HttpPost]
            public ActionResult Index(Header model) {
                 //Mettre un point d'arrêt ici et regarder le contenu de Request.Form
                 return View(model);
            }
            public ActionResult About()
            {
                return View();
            }
        }
    }
    Les vues
    Le layout est le layout par défaut d'un projet MVC3 Intranet

    L'EditorTemplate de la ligne de détail:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @model MVC_HeaderDetailsTester.Models.DetailRow
    <tr>
    <td>@Html.TextBoxFor(m => m.Id)</td>
    <td>@Html.TextBoxFor(m => m.EventDate)</td>
    <td>@Html.TextBoxFor(m => m.Description)</td>
    <td>@Html.CheckBoxFor(m => m.Checked)</td>
    </tr>
    La vue Index
    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
     
    @model MVC_HeaderDetailsTester.Models.Header
     
    @{
        ViewBag.Title = "Index";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
     
    <h2>Index</h2>
     
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
     
    @using (Html.BeginForm()) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Header</legend>
     
            @Html.HiddenFor(model => model.Id)
     
            <div class="editor-label">
                @Html.LabelFor(model => model.Name)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </div>
     
            <div>
            <table>
            @foreach (var item in Model.DetailRows) { 
                @Html.EditorFor(M => item,"DetailEditor")
            }
            </table>
            </div>
     
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    }
     
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    Voici le code client généré :
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title>Index</title>
        <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
        <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
        <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
    </head>
    <body>
        <div class="page">
            <header>
                <div id="title">
                    <h1>My MVC Application</h1>
                </div>
                <div id="logindisplay">
                    Welcome <strong>ALBINGIA\ljordi</strong>!
                </div>
                <nav>
                    <ul id="menu">
                        <li><a href="/">Home</a></li>
                        <li><a href="/Home/About">About</a></li>
                    </ul>
                </nav>
            </header>
            <section id="main">
     
     
    <h2>Index</h2>
     
    <script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
    <script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>
     
    <form action="/" method="post">    <fieldset>
            <legend>Header</legend>
     
            <input data-val="true" data-val-number="The field N&amp;#176; must be a number." data-val-required="Le champ N&amp;#176; est requis." id="Id" name="Id" type="hidden" value="1" />
     
            <div class="editor-label">
                <label for="Name">Nom</label>
            </div>
            <div class="editor-field">
                <input class="text-box single-line" id="Name" name="Name" type="text" value="Fred" />
                <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>
            </div>
     
            <div>
            <table>
    <tr>
        <td><input data-val="true" data-val-number="The field N&amp;#176; d&amp;#39;&amp;#233;v&amp;#232;nnement must be a number." data-val-required="Le champ N&amp;#176; d&amp;#39;&amp;#233;v&amp;#232;nnement est requis." id="item_Id" name="item.Id" type="text" value="1" />
        </td>
        <td><input data-val="true" data-val-required="Le champ Date &amp;#233;v&amp;#232;nnement est requis." id="item_EventDate" name="item.EventDate" type="text" value="10/01/2012 00:00:00" />
        </td>
        <td><input id="item_Description" name="item.Description" type="text" value="Event 3" />
        </td>
        <td><input checked="checked" data-val="true" data-val-required="Le champ Contr&amp;#244;l&amp;#233; est requis." id="item_Checked" name="item.Checked" type="checkbox" value="true" /><input name="item.Checked" type="hidden" value="false" />
        </td>
    </tr>
    <tr>
        <td><input id="item_Id" name="item.Id" type="text" value="2" />
        </td>
        <td><input id="item_EventDate" name="item.EventDate" type="text" value="08/01/2012 00:00:00" />
        </td>
        <td><input id="item_Description" name="item.Description" type="text" value="Event 2" />
        </td>
        <td><input id="item_Checked" name="item.Checked" type="checkbox" value="true" /><input name="item.Checked" type="hidden" value="false" />
        </td>
    </tr>
    <tr>
        <td><input id="item_Id" name="item.Id" type="text" value="1" />
        </td>
        <td><input id="item_EventDate" name="item.EventDate" type="text" value="08/01/2012 00:00:00" />
        </td>
        <td><input id="item_Description" name="item.Description" type="text" value="Event 1" />
        </td>
        <td><input id="item_Checked" name="item.Checked" type="checkbox" value="true" /><input name="item.Checked" type="hidden" value="false" />
        </td>
    </tr>
            </table>
            </div>
     
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
    </form>
    <div>
        <a href="/">Back to List</a>
    </div>
     
            </section>
            <footer>
            </footer>
        </div>
    </body>
    </html>

    Dans l'attente de vos avis,

    Je vous remercie par avance pour votre aide,

    Laurent

  2. #2
    CUCARACHA
    Invité(e)
    Par défaut
    J'ai finalement trouvé.

    En fait il ne faut pas mettre la boucle autour de l'EditorFor et il faut que la classe de l'EditorFor soit T de la List<T>. Il faut aussi que l'EditorFor ait exactement le même nom que la classe pour laquelle il a été créé.

    ++

    Laurent

Discussions similaires

  1. [PEAR][HTML_QuickForm] Impossible de récupérer les valeurs du formulaire
    Par Mainman dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/05/2007, 12h15
  2. [Outlook] Impossible de récupérer mes messages ...
    Par Rumeurs dans le forum Outlook
    Réponses: 4
    Dernier message: 13/04/2006, 19h05
  3. XMLHttpRequest : Impossible de récupérer les données
    Par laurent_ifips dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 22/11/2005, 13h28
  4. [HTML][PHP] Formulaire impossible de récupérer les variables
    Par Pfeffer dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 11/11/2005, 16h08
  5. Réponses: 1
    Dernier message: 05/07/2005, 10h47

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