У 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" />
Згенерує ці пари + name + value, які будуть надіслані на сервер:
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входи взагалі не надаються.