Bonjour à tous,
Apparemment il n'y a pas de ViewState en MVC(4) (par contre il y a un ModelState !). Ceci à comme désavantage de perdre des valeurs entre le Get et le Post (me semble-t-il).
Voila mon problème :
Dans ma méthode HttpGet j'instancie un model, le remplit avec des valeurs par défaut (des listes pour dropdownlist, des sous-collections de mon model). Ça fonctionne bien et ma vue s'affiche correctement. Ça donne comme code :
Je remplit la collection de roles aspnet_Roles avec tous les rôles possible de l'application.
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 [AllowAnonymous] public ActionResult Register() { aspnet_Users model = new aspnet_Users(); DateTime dt_18 = DateTime.Now.AddYears(-18); model.BirthDays = GetListDays(); model.BirthMonths = GetListMonths(); model.BirthYears = GetListYears(dt_18); model.CountryCodes = GetListCountryCodes(); model.SelectedCountryCode = "33"; model.SelectedBirthDay = dt_18.Day.ToString(); model.SelectedBirthMonth = dt_18.Month.ToString(); model.SelectedBirthYear = dt_18.Year.ToString(); List<aspnet_Roles> l2 = db.aspnet_Roles.Where(r => r.aspnet_Applications.ApplicationName == "Toto").ToList(); foreach (aspnet_Roles r in l2) { model.aspnet_Roles.Add(r); } return View(model); }
Enfin de méthode Get je retourne la vue portant sur le modèle instancié (est-ce bien orthodoxe ?, habituellement on renvoit une vue "vide").
(vous aurez peut-être reconnu une customisation d' ExtendedMemshipProvider).
Dans la méthode Post il s'avère que le modèle a perdu certaines valeurs (parce que pas de viewstate ?).
La méthode post donne :
Les listes du modèle telles que model.BirthDays, model.BirthMonths, model.BirthYears, model.CountryCodes
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 [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public ActionResult Register(aspnet_Users model) { if (ModelState.IsValid) { // Tentative d'inscription de l'utilisateur try { DateTime dt_18 = DateTime.Now.AddYears(-18); model.BirthDays = GetListDays(); model.BirthMonths = GetListMonths(); model.BirthYears = GetListYears(dt_18); model.CountryCodes = GetListCountryCodes(); string bStr = model.SelectedBirthDay + "/" + model.SelectedBirthMonth + "/" + model.SelectedBirthYear; DateTime dateTest; if (!DateTime.TryParse(bStr, out dateTest)) { throw new Exception("Date de naissance incorrecte"); } if (dateTest.AddYears(18) > DateTime.Now) { throw new Exception("Vous devez avoir plus de 18 ans pour vous inscrire à ce site de Covoiturage"); } model.BirthDate = dateTest; model.CountryCode = int.Parse(model.SelectedCountryCode); CovoiturageMembershipProvider provider = (CovoiturageMembershipProvider)Membership.Providers["CovoiturageMembershipProvider"]; System.Web.Security.MembershipCreateStatus status; MembershipUser usr = provider.CreateUser(model, out status); if (status == MembershipCreateStatus.Success) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, usr.UserName, DateTime.Now, DateTime.Now.AddMonths(1), false, "", //userData FormsAuthentication.FormsCookiePath); // Encrypt the ticket. string encTicket = FormsAuthentication.Encrypt(ticket); // Create the cookie. Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); return RedirectToAction("EspaceUtilisateur", new RouteValueDictionary( new { controller = "User", action = "EspaceUtilisateur", username = usr.UserName })); } else { ModelState.AddModelError(status.ToString(), GetErrorMessage(status)); } } catch (Exception e) { ModelState.AddModelError("", e.Message); } } // Si nous sommes arrivés là, quelque chose a échoué, réafficher le formulaire return View(model); }
ont perdu leurs valeurs et sont re-remplies (bon c'est pas terrible faudrait que j'utilise des listes statiques, mais ce n'est pas le problème de ce post).
Et enfin la collection aspnet_Roles du modèle s'est vidée, ce qui est plus grave car on perd ce qui a été saisi dans la vue...
Questions :
- Ma façon de faire est-elle correcte ?
- Comment ne pas perdre la collection aspnet_Roles (une PartialVue sur cette collection ? mais je perds également les données) ?
Des idées, best practices pour faire ce que j'ai à faire ?
Merci d'avance de vos éclaircissements.
Partager