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 :

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);
        }
Je remplit la collection de roles aspnet_Roles avec tous les rôles possible de l'application.

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 :

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);
        }
Les listes du modèle telles que model.BirthDays, model.BirthMonths, model.BirthYears, model.CountryCodes

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.