У меня была такая же проблема. Я исправил это с помощью следующей комбинации (с небольшой помощью Дарина Димитрова - спасибо):
ВИД:
<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%>
Контроллер:
public ActionResult Index()
{
ViewData["Optin"] = True;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form, bool OptIn )
{
ViewData["Optin"] = OptIn;
}
Вот источник для элемента управления с установленным флажком и без него (для справки):
Проверено:
<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />
Неконтролируемый:
<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />
Итак, вот как я интерпретирую поведение:
HTML не будет отправлять обратно значение поля, если флажок снят, но будет отправлять обратно, если оно установлено. Помощник добавляет скрытое поле после элемента управления флажком (значение «Ложь»). Если флажок установлен, источник показывает «флажок =« проверен »», если он не отмечен, он не отображается. Таким образом, если флажок = проверен, значение true передается обратно в контроллер. Если флажок снят, управление не передается обратно, поэтому скрытое поле, названное так же, вступает во владение и возвращает ложное значение. Таким образом, у вас есть оба условия. Странно, но это работает. Надеюсь, это поможет.