Mon approche ici peut être entièrement faux, mais j'apprends lentement MVC ... J'ai un formulaire par lequel un utilisateur doit sélectionner un nombre de (ou pas) de modules, basé sur ce modèle:Checkbox vérifié valeur perdue si! ModelState.IsValid
public class MyProductModule
{
public string ModuleName { get; set; }
public bool Checked { get; set; }
}
public class ProductRequest
{
public ProductRequest()
{
Modules = LoadModules();
}
public static List<MyProductModule> LoadModules()
{
return new List<MyProductModule>()
{
new MyProductModule() { ModuleName = "Module One", Checked = false },
new MyProductModule() { ModuleName = "Module Two", Checked = false },
new MyProductModule() { ModuleName = "Module Three", Checked = false }
};
}
[Required]
[EmailAddress]
public string Email { get; set; }
[DisplayName("MyProduct Modules")]
public List<MyProductModule> Modules { get; set; }
}
Une liste de case est rendue pour afficher chaque module:
@for (int i = 0; i < Model.Modules.Count; i++)
{
@Html.CheckBoxFor(m => m.Modules[i].Checked)
@Html.HiddenFor(m => m.Modules[i].ModuleName)
@Html.LabelFor(m => m.Modules[i].Checked, Model.Modules[i].ModuleName)
}
Enfin, la forme est traitée comme suit:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ProcessRequest(ProductRequest qd)
{
if (!ModelState.IsValid)
{
return View("Index", qd);
}
else
{
// check email domains
List<string> badDomains = new List<string>();
badDomains.Add("gmail");
badDomains.Add("yahoo");
badDomains.Add("hotmail");
foreach (string s in badDomains)
{
if (qd.Email.Contains(string.Format("@{0}.", s)))
{
ModelState.AddModelError(string.Empty, string.Format("Please use your work email address.", s));
}
}
if (!ModelState.IsValid)
{
return View("Index", qd);
}
else
{
// process
}
}
}
Tout fonctionne parfaitement, sauf si, pour une raison quelconque, ma validation côté serveur échoue et que le modèle est renvoyé (return View("Index", qd);
). À ce moment-là, la liste des cases à cocher change mystérieusement de ceci:
[x] Module One
[ ] Module Two
[ ] Module Three
... à ceci:
[ ] Module One
[ ] Module Two
[ ] Module Three
Toutes les valeurs de cases à cocher sont perdus. Si j'examine les données affichées brutes dans Firebug, je vois que, pour une raison à la fois vrai et faux sont affichés pour les cases à cocher « checked »:
Que se passe si vous venez de faire 'retour View ("Index")'? –
La vue renvoie l'erreur 500 (référence null) lorsqu'elle tente de lire les propriétés du modèle. – EvilDr
Avez-vous besoin de revenir à l'affichage de l'index? Qu'en est-il juste de 'return View()'? –