En HTML, chaque <input />
est associé à un seul (mais pas unique) couple nom/valeur. Cette paire est envoyée dans la requête suivante (dans ce cas, un corps de requête POST) uniquement si l'élément <input />
est "réussi".
Donc si vous avez ces entrées dans votre <form>
DOM :
<input type="text" name="one" value="foo" />
<input type="text" name="two" value="bar" disabled="disabled" />
<input type="text" name="three" value="first" />
<input type="text" name="three" value="second" />
<input type="checkbox" name="four" value="baz" />
<input type="checkbox" name="five" value="baz" checked="checked" />
<input type="checkbox" name="six" value="qux" checked="checked" disabled="disabled" />
<input type="checkbox" name="" value="seven" checked="checked" />
<input type="radio" name="eight" value="corge" />
<input type="radio" name="eight" value="grault" checked="checked" />
<input type="radio" name="eight" value="garply" />
Générera ces paires nom+valeur qui seront soumises au serveur :
one=foo
three=first
three=second
five=baz
eight=grault
Remarquez ça :
-
two
y six
ont été exclus parce qu'ils avaient le disabled
l'ensemble des attributs.
-
three
a été envoyé deux fois parce qu'il avait deux entrées valides avec le même nom.
-
four
n'a pas été envoyé car il s'agit d'un checkbox
qui n'était pas checked
-
six
n'a pas été envoyé bien qu'il ait été checked
parce que le disabled
a une priorité plus élevée.
-
seven
n'a pas de name=""
envoyé, il n'est donc pas soumis.
En ce qui concerne votre question : vous pouvez voir qu'une case à cocher qui n'est pas cochée n'aura donc pas sa paire nom+valeur envoyée au serveur - mais d'autres entrées qui partagent le même nom seront envoyées avec elle.
Les frameworks comme ASP.NET MVC contournent ce problème en associant (subrepticement) chaque checkbox
avec une hidden
dans le HTML rendu, comme suit :
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
Rendu :
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
Si l'utilisateur ne coche pas la case, le message suivant sera envoyé au serveur :
SomeBooleanProperty=false
Si l'utilisateur coche la case, les deux seront envoyés :
SomeBooleanProperty=true
SomeBooleanProperty=false
Mais le serveur ignorera le =false
parce qu'il voit la =true
et donc s'il ne voit pas =true
il peut déterminer que la case à cocher a été rendue et que l'utilisateur ne l'a pas cochée - contrairement à l'option SomeBooleanProperty
les entrées ne sont pas rendues du tout.