Метод Razor ViewEngine HTML.Checkbox создает скрытый ввод. Зачем?

Я написал код ниже на моей странице просмотра;

@Html.CheckBox("ChxName",true)

и я получил следующий результат:

<input checked="checked" id="ChxName" name="ChxName" type="checkbox" value="true" />
<input name="ChxName" type="hidden" value="false" />

почему есть элемент ввода, названный так же, что и флажок?

Ответ 1

Не отмеченные флажки не размещены, поэтому скрытое поле (установленное как false) позволяет привязке модели по-прежнему работать.

Посмотрите на Request.Form на пост. Если флажок установлен, вы увидите:

ChxName=true&ChxName=false

Модельное связующее использует первое значение.

и если флажок не установлен, вы увидите:

ChxName=false

Ответ 2

ericvg объяснил это хорошо.

Ручной подход таков:

bool IsDefault = (Request.Form["IsDefault"] != "false");

Ответ 3

Или используйте Contains ( "true" ), который я нахожу немного опрятным...

bool myCheckBoxValue = Server.HtmlEncode(Request.QueryString["MyCheckBoxValue"]).Contains("true");