В 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
входных данных, которые вообще не отображались.