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:
two
et six
ont été exclus parce qu'ils avaient l' disabled
ensemble d'attributs.
three
a été envoyé deux fois car il contenait deux entrées valides portant le même nom.
four
n'a pas été envoyé car c'est un checkbox
qui n'a pas étéchecked
six
n'a pas été envoyé malgré le fait checked
que l' disabled
attribut a une priorité plus élevée.
seven
n'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 checkbox
entrée à une hidden
entré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 =false
version car il voit la =true
version, et donc s'il ne la voit pas, =true
il 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 SomeBooleanProperty
entrées ne soient pas rendues du tout.