Tuve el mismo problema. Lo arreglé con la siguiente combinación (con un poco de ayuda de Darin Dimitrov - gracias):
VISTA:
<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%>
controlador:
public ActionResult Index()
{
ViewData["Optin"] = True;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection form, bool OptIn)
{
ViewData["Optin"] = OptIn;
}
Aquí está la fuente para el control con y sin la casilla realmente marcada (como referencia):
Chequeado:
<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />
Desactivada:
<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" />
lo tanto, aquí es como de interpretar el comportamiento:
HTML no después de vuelta el valor del campo si la casilla de verificación no está marcada, sino que después de vuelta si lo es. El asistente agrega un campo oculto después del control de casilla de verificación (valor de 'False'). Si la casilla de verificación está marcada, la fuente muestra "checked = 'checked'" si está desmarcada, esto no aparece. Por lo tanto, si está marcado = marcado, verdadero pasa al controlador. Si la casilla no está marcada, el control no se remite, por lo que el campo oculto, llamado igual, se hace cargo y devuelve un falso. De esta forma tienes ambas condiciones. Extraño pero funciona. Espero que esto ayude.
¿Es la responsabilidad de los navegadores de enviar o no enviar valor de casilla de verificación para solicitarla? ¿Por qué? – Jalal
¿Qué ocurre si utilizo '' directamente en la Vista? – Jalal
@Jalal Amini, de hecho, podría usar directamente '' en la vista si desea evitar tener este campo oculto. –