En HTML, chaque <input />élément est associé à une paire nom / valeur unique (mais pas unique). Cette paire est envoyée dans la requête suivante (dans ce cas, un corps de requête POST) uniquement si le <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
Remarquerez que:
twoet sixont été exclus parce qu'ils avaient l' disabledensemble d'attributs.
three a été envoyé deux fois car il contenait deux entrées valides portant le même nom.
fourn'a pas été envoyé car c'est un checkboxqui n'a pas étéchecked
sixn'a pas été envoyé malgré le fait checkedque l' disabledattribut a une priorité plus élevée.
sevenn'a pas d' name=""attribut envoyé, il n'est donc pas soumis.
En ce qui concerne votre question: vous pouvez voir qu'une case à cocher non cochée n'aura donc pas sa paire nom + valeur envoyée au serveur - mais d'autres entrées partageant le même nom seront envoyées avec lui.
Des cadres comme ASP.NET MVC contournent ce problème en associant (subrepticement) chaque checkboxentrée à une hiddenentrée dans le HTML rendu, comme ceci:
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
Rendus:
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
Si l'utilisateur ne coche pas la case, les informations suivantes seront envoyées au serveur:
SomeBooleanProperty=false
Si l'utilisateur coche la case, les deux seront envoyés:
SomeBooleanProperty=true
SomeBooleanProperty=false
Mais le serveur ignorera la =falseversion car il voit la =trueversion, et donc s'il ne la voit pas, =trueil peut déterminer que la case à cocher a été rendue et que l'utilisateur ne l'a pas cochée - par opposition à ce que les SomeBooleanPropertyentrées ne soient pas rendues du tout.