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:
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 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; } } }
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 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>(); } } }
Les vues
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(); } } }
Le layout est le layout par défaut d'un projet MVC3 Intranet
L'EditorTemplate de la ligne de détail:
La vue Index
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>
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 @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>
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&#176; must be a number." data-val-required="Le champ N&#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&#176; d&#39;&#233;v&#232;nnement must be a number." data-val-required="Le champ N&#176; d&#39;&#233;v&#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 &#233;v&#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&#244;l&#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
Partager