Je viens de remarquer que Html.CheckBox("foo")
génère 2 entrées au lieu d'une, tout le monde sait pourquoi en est-il ainsi?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
asp.net-mvc
Omu
la source
la source
Réponses:
Si la case n'est pas cochée, le champ du formulaire n'est pas soumis. C'est pourquoi il y a toujours une fausse valeur dans un champ caché. Si vous ne cochez pas la case, le formulaire aura toujours la valeur du champ masqué. Voilà comment ASP.NET MVC gère les valeurs des cases à cocher.
Si vous souhaitez confirmer cela, cochez une case sur le formulaire non pas avec Html.Hidden, mais avec
<input type="checkbox" name="MyTestCheckboxValue"></input>
. Ne cochez pas la case, soumettez le formulaire et examinez les valeurs de demande publiées côté serveur. Vous verrez qu'il n'y a pas de valeur de case à cocher. Si vous aviez un champ caché, il contiendrait uneMyTestCheckboxValue
entrée avec unefalse
valeur.la source
IsActive
, qui est initiéetrue
dans le constructeur. L'utilisateur désélectionne la case à cocher, mais comme la valeur n'est pas envoyée au serveur, le classeur de modèle ne la récupère pas et la valeur de la propriété n'est pas modifiée. Le classeur de modèles ne doit pas supposer que si la valeur n'est pas envoyée, elle est définie sur false, car il pourrait être votre décision de ne pas envoyer cette valeur.false
valeur même si elles sont cochées, ce qui est déroutant. Les cases à cocher désactivées ne doivent pas envoyer de valeur du tout, si ASP.NET veut être compatible avec le comportement HTTP par défaut.Vous pouvez écrire un assistant pour empêcher l'ajout de l'entrée masquée:
utilise le:
la source
@using Your.Name.Space
en haut de votre fichier de vue de rasoir .cshtml.System.Web.Mvc.Html
de noms pour qu'il soit accessible sur toutes les vueslorsque la case est cochée et soumise, effectuez cette opération
Référer
la source
L'approche manuelle est la suivante:
la source
Voici la version fortement typée de la solution d'Alexander Trofimov:
la source
Utilisez Contient, cela fonctionnera avec les deux valeurs de publication possibles: "false" ou "true, false".
la source
L'entrée masquée causait des problèmes avec les cases à cocher stylisées. J'ai donc créé une extension d'assistance HTML pour placer l'entrée cachée en dehors de la div contenant la CheckBox.
Résultat
la source
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 souhaitez traiter les champs de saisie de case à cocher avec jQuery, utilisez la méthode prop (passez la propriété 'checked' comme paramètre). Exemple:
$('#id').prop('checked')
la source
Vous pouvez essayer d'initialiser le constructeur de votre modèle comme ça:
et selon vous:
la source
J'ai trouvé que cela causait vraiment des problèmes lorsque j'avais un WebGrid. Les liens de tri sur le WebGrid tourneraient par la chaîne de requête doublée ou x = true & x = false en x = true, false et provoqueraient une erreur d'analyse dans la case à cocher pour.
J'ai fini par utiliser jQuery pour supprimer les champs cachés côté client:
la source