2011-05-09 48 views

Respuesta

25

Eso es porque el ayudante CheckBox genera un campo oculto adicional con el mismo nombre que la casilla de verificación (se puede ver navegando por la generada código fuente):

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

Ambos valores son enviado a la acción del controlador cuando envía el formulario. He aquí un comentario directamente desde el código fuente de ASP.NET MVC explicar el razonamiento detrás de este campo oculto adicional:

if (inputType == InputType.CheckBox) { 
    // Render an additional <input type="hidden".../> for checkboxes. This 
    // addresses scenarios where unchecked checkboxes are not sent in the request. 
    // Sending a hidden input makes it possible to know that the checkbox was present 
    // on the page when the request was submitted. 
    ... 

En lugar de utilizar FormCollection yo le recomendaría el uso de modelos de vista como parámetros de acción o directamente tipos escalares y dejar la molestia de analizar a la carpeta de modelo predeterminada:

public ActionResult SomeAction(bool visible) 
{ 
    ... 
} 
+0

¿Es la responsabilidad de los navegadores de enviar o no enviar valor de casilla de verificación para solicitarla? ¿Por qué? – Jalal

+0

¿Qué ocurre si utilizo '' directamente en la Vista? – Jalal

+0

@Jalal Amini, de hecho, podría usar directamente '' en la vista si desea evitar tener este campo oculto. –

1

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.

9

Hace poco resolví este problema y se me ocurrió un método para eludir el enlace de MVC y el uso de Contiene ("verdadero") en la cadena de consulta. Nada más funcionó para mí.

Si las personas están atrapados con las otras respuestas, entonces esto es lo que funcionó para mí - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

+1

Hice lo mismo. Matar el tiempo con casillas de verificación – Sakthivel

+1

Gracias, esto fue útil. –

2

Si quieres/necesidad de utilizar FormCollection, en lugar de la comprobación de true o false, la verificación de true,false o false.

p. Ej. en lugar de esto

adslService.Visible = bool.Parse(collection["Visible"]); 

hacer esto

adslService.Visible = bool.Parse(collection["Visible"] != "false"); 
+0

Esta solución da un error: "no se puede convertir 'bool' en 'cadena'" –

+0

Debe ser: 'adslService.Visible = colección [" Visible "]! =" Falso ";' –

2

que tenía el mismo problema en MVC 4,

Esta solución funcionó para mí.

Mi (forma) Vista:

@Html.EditorFor(m => m.SomeBoolValue) 

para anular el duplicado los valores "verdadero, falso" cuando CheckBox es cierto

Almacené el parámetro CheckBox en una matriz:

var arrParams = Request.Form["SomeBoolValue"].Split(','); 

Agarra el primer elemento:

string sParam = arrParams[0].ToString(); 

analizarlo:

bool BoolValue = bool.Parse(sParam); 

Keep it:

MyObject.SomeBoolValue = BoolValue; 
0

El comportamiento por defecto de la MVC entension para Html.Checkbox, genera un campo oculto junto con él para ser publicado. En mi caso, debido a que la casilla de verificación personalizada que he agregado a la página no está enlazada con el modelo como Html.CheckBoxFor, he decidido convertirla en una simple casilla de verificación html.

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

Esto puede sonar tonto, pero ahorraría tiempo de alguien que correr después de arounds de trabajo. Esto impedirá la creación de una casilla de verificación usando MVC extensión

0

Ya tengo una función estática que utilizo en todas partes para manejar texto tipo booleano y devolver verdadero o falso como un valor lógico por lo que sólo se encargue de ello hay

  if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes 

      else if (sBool == "true") bReturn = true; 

      else if (sBool == "t") bReturn = true;//t-f 

      else if (sBool == "1") bReturn = true;//1-0 

      else if (sBool == "yes") bReturn = true;//yes-no 

      else if (sBool == "y") bReturn = true;//y-n 

      else if (sBool == "on") bReturn = true;//on-off 
Cuestiones relacionadas