asp.net mvc: pourquoi Html.CheckBox génère-t-il une autre entrée cachée?

Je viens de remarquer que Html.CheckBox("foo") génère 2 entrées au lieu d’une, tout le monde sait pourquoi?

   

Si la case n’est pas cochée, le champ de formulaire n’est pas soumis. C’est pourquoi il y a toujours une valeur fausse dans le champ caché. Si vous laissez la case non cochée, le formulaire aura toujours la valeur du champ masqué. C’est ainsi que ASP.NET MVC gère les valeurs de case à cocher.

Si vous souhaitez confirmer cela, cochez la case du formulaire qui n’est pas en Html.Hidden, mais avec . Ne cochez pas la case, soumettez le formulaire et examinez les valeurs de requête publiées côté serveur. Vous verrez qu’il n’y a pas de valeur de case à cocher. Si vous aviez un champ masqué, il contiendrait l’entrée MyTestCheckboxValue avec false valeur false .

Vous pouvez écrire un assistant pour empêcher l’ajout de l’entrée masquée:

 using System.Web.Mvc; using System.Web.Mvc.Html; public static class HelperUI { public static MvcHtmlSsortingng CheckBoxSimple(this HtmlHelper htmlHelper, ssortingng name, object htmlAtsortingbutes) { ssortingng checkBoxWithHidden = htmlHelper.CheckBox(name, htmlAtsortingbutes).ToHtmlSsortingng().Trim(); ssortingng pureCheckBox = checkBoxWithHidden.Subssortingng(0, checkBoxWithHidden.IndexOf(" 

utilise le:

 @Html.CheckBoxSimple("foo", new {value = bar.Id}) 

lorsque la case à cocher est cochée et soumise, effectuez cette opération

 if ($('[name="foo"]:checked').length > 0) $('[name="foo"]:hidden').val(true); 

Référer

L’approche manuelle est la suivante:

 bool IsDefault = (Request.Form["IsDefault"] != "false"); 

Ceci est la version fortement typée de la solution d’Alexander Trofimov:

 using System.Web.Mvc; using System.Web.Mvc.Html; public static class HelperUI { public static MvcHtmlSsortingng CheckBoxSimpleFor(this HtmlHelper htmlHelper, Expression> expression, object htmlAtsortingbutes) { ssortingng checkBoxWithHidden = htmlHelper.CheckBoxFor(expression, htmlAtsortingbutes).ToHtmlSsortingng().Trim(); ssortingng pureCheckBox = checkBoxWithHidden.Subssortingng(0, checkBoxWithHidden.IndexOf(" 

Use Contains, cela fonctionnera avec les deux valeurs possibles de post: “false” ou “true, false”.

 bool isChecked = Request.Form["foo"].Contains("true"); 

Ce n’est pas un bug! Il ajoute la possibilité d’avoir toujours une valeur, après avoir posté le formulaire sur le serveur. Si vous voulez traiter des champs de saisie avec jQuery, utilisez la méthode prop (passez la propriété ‘checked’ comme paramètre). Exemple: $('#id').prop('checked')

Vous pouvez essayer d’initialiser le constructeur de votre modèle comme ceci:

 public MemberFormModel() { foo = true; } 

et à votre avis:

 @html.Checkbox(...) @html.Hidden(...) 

J’ai trouvé que cela causait vraiment des problèmes lorsque j’avais un WebGrid. Les liens de sorting sur WebGrid se passeraient de la chaîne de requête doublée ou de x = true & x = false dans x = true, false et provoquerait une erreur d’parsing dans la case à cocher pour.

J’ai fini par utiliser jQuery pour supprimer les champs cachés du côté client: