2008-11-10 7 views
0

J'ai un projet ASP.NET MVC avec un formulaire. Dans la méthode Action qui gère le verbe POST, j'ai une implémentation personnalisée IModelBinder qui lie les données de formulaire à mon instance de modèle. S'il y a des erreurs j'utilise bindingContext.ModelState.SetAttemptedValue() et bindingContext.ModelState.AddModelError() pour persister la valeur soumise et le message d'erreur au ModelState.Comment puis-je obtenir CheckBox pour maintenir l'état vérifié à travers la publication dans ASP.NET MVC?

Cela fonctionne très bien et je peux voir le comportement attendu se produisant sur mes contrôles d'entrée qui sont rendus avec Html.TextBox() (qui appelle jusqu'à Html.InputHelper()). Lorsque j'utilise Html.CheckBox() (qui appelle également à Html.InputHelper()) l'état de mon CheckBox est PAS sortie à l'étiquette <input />.

Il me semble que la méthode Html.InputHelper() n'utilise pas AttemptedValue de ModelState pour les champs de saisie de type CheckBox.

Voici le code de ASP.NET MVC Html.InputHelper() method.

Pourquoi est-ce que la CheckBox triedValue n'est pas sortie vers l'étiquette d'entrée. Y at-il quelque chose qui me manque ici ou dois-je gérer manuellement ce cas en vérifiant le ModelState et en définissant moi-même l'attribut du tag?

Mise à jour 11/09
Voici l'appel à HtmlHelpers que j'utilise pour produire le CheckBox:

<%= Html.CheckBox("IsDerived") %> 

Et voici l'appel que je me sers pour enregistrer la valeur tentée:

string isDerivedRequestValue = !string.IsNullOrEmpty(bindingContext.HttpContext.Request["IsDerived"]) ? bindingContext.HttpContext.Request.Form.GetValues("IsDerived") [0] : null; 
bindingContext.ModelState.SetAttemptedValue("IsDerived", isDerivedRequestValue); 

Répondre

1

Je ne suis pas sûr que ce soit la meilleure façon de résoudre le problème ou non, mais étant donné que la méthode Html.InputHelper() ne vérifie pas la AttemptedValue pour les contrôles CheckBox, j'ai ajouté ce qui suit à mon contrôleur qui incorpore la valeur correcte du ModelState en ViewData et semble très bien faire l'affaire.

ViewData["IsDerived"] = ViewData.ModelState.ContainsKey("IsDerived") 
          ? bool.Parse(ViewData.ModelState["IsDerived"].AttemptedValue) 
          : false; 

Assurez-vous que vous ne définissez pas explicitement la valeur du paramètre isChecked lorsque vous appelez Html.CheckBox() comme cela passer outre toute valeur stockée dans ViewData.

Questions connexes