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:
twoi sixzostali wykluczeni, ponieważ mieli disabledustawiony atrybut.
three został wysłany dwukrotnie, ponieważ miał dwa prawidłowe dane wejściowe o tej samej nazwie.
fournie zostało wysłane, ponieważ to checkboxnie byłochecked
sixnie został wysłany pomimo tego, checkedże disabledatrybut ma wyższy priorytet.
sevennie 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 checkboxwejście z hiddenwejś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 =falsewersję, 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 SomeBooleanPropertybraku renderowania danych wejściowych.