В HTML каждый <input />элемент связан с одной (но не уникальной) парой имени и значения. Эта пара отправляется в последующем запросе (в данном случае это тело запроса POST), только если <input />он «успешен».
Так что, если у вас есть эти входы в вашей <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" />
Сгенерирует эти пары имя + значение, которые будут отправлены на сервер:
one=foo
three=first
three=second
five=baz
eight=grault
Заметь:
twoи sixбыли исключены, потому что у них был установлен disabledатрибут.
three был отправлен дважды, потому что у него было два допустимых входа с одинаковым именем.
fourне был отправлен, потому что это checkboxне былоchecked
sixне был отправлен несмотря на то, checkedчто disabledатрибут имеет более высокий приоритет.
sevenне имеет name=""отправленного атрибута, поэтому он не передан.
Что касается вашего вопроса: вы можете видеть, что флажок, который не отмечен, поэтому не будет отправлять на сервер свою пару имя / значение - но другие входные данные, которые имеют такое же имя, будут отправлены вместе с ним.
Фреймворки, такие как ASP.NET MVC, обходят это путем (тайно) связывания каждого checkboxввода с hiddenвводом в отображаемом HTML, например, так:
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
Оказывает:
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
Если пользователь не установит флажок, на сервер будет отправлено следующее:
SomeBooleanProperty=false
Если пользователь установит флажок, будут отправлены оба:
SomeBooleanProperty=true
SomeBooleanProperty=false
Но сервер будет игнорировать =falseверсию, потому что он видит =trueверсию, и поэтому, если он не видит, =trueон может определить, что флажок был отображен и что пользователь не проверял его, в отличие от SomeBooleanPropertyвходных данных, которые вообще не отображались.