W HTML każdy <input />
element jest powiązany z jedną (ale nie unikalną) parą nazwa i wartość. Ta para jest wysyłana w kolejnym żądaniu (w tym przypadku w treści żądania POST) tylko wtedy, gdy <input />
jest „udana”.
Więc jeśli masz te dane wejściowe w swoim <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" />
Wygeneruje te pary nazwa + wartość, które zostaną przesłane do serwera:
one=foo
three=first
three=second
five=baz
eight=grault
Zauważ, że:
two
i six
zostali wykluczeni, ponieważ mieli disabled
ustawiony atrybut.
three
został wysłany dwukrotnie, ponieważ miał dwa prawidłowe dane wejściowe o tej samej nazwie.
four
nie zostało wysłane, ponieważ to checkbox
nie byłochecked
six
nie został wysłany pomimo tego, checked
że disabled
atrybut ma wyższy priorytet.
seven
nie ma name=""
przesłanego atrybutu, więc nie został przesłany.
W odniesieniu do twojego pytania: możesz zobaczyć, że pole wyboru, które nie jest zaznaczone, nie będzie w związku z tym przesyłane do serwera para nazwa-wartość - ale zostaną do niego wysłane inne dane wejściowe o tej samej nazwie.
Frameworki takie jak ASP.NET MVC działają w tym celu (ukradkowo) łącząc każde checkbox
wejście z hidden
wejściem w renderowanym HTML, w następujący sposób:
@Html.CheckBoxFor( m => m.SomeBooleanProperty )
Renderuje:
<input type="checkbox" name="SomeBooleanProperty" value="true" />
<input type="hidden" name="SomeBooleanProperty" value="false" />
Jeśli użytkownik nie zaznaczy pola wyboru, na serwer zostaną wysłane następujące informacje:
SomeBooleanProperty=false
Jeśli użytkownik zaznaczy pole wyboru, oba zostaną wysłane:
SomeBooleanProperty=true
SomeBooleanProperty=false
Ale serwer zignoruje =false
wersję, ponieważ ją widzi =true
, a więc jeśli jej nie widzi =true
, może stwierdzić, że pole wyboru zostało zrenderowane i że użytkownik go nie sprawdził - w przeciwieństwie do SomeBooleanProperty
braku renderowania danych wejściowych.