Supléer l'absence de ViewState en MVC(4)
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:
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:
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.