2011-11-14 6 views
14

He creado una página bastante sencillo con una casilla de verificación:Valores MV3 Duplicar cadena de consulta para CheckBox (verdadero, falso para booleano)

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Get)) 
{ 
    @Html.CheckBoxFor(x => x.MyCheckBox) 
    <input type="submit" value="Go!" />  
} 

La URL se rellena con el valor MyCheckBox dos veces !? Como tal:

MyAction?MyCheckBox=true&MyCheckBox=false 

Solo duplica el valor si la casilla de verificación es verdadera. Si se establece en falso, solo aparecerá una vez en la cadena de consulta.

El código anterior se simplifica ya que tengo un par de menús desplegables y un cuadro de texto en el formulario que funciona bien. No creo que haya nada inusual en el código que he omitido de esta pregunta.

¿Alguien ha tenido un problema similar al duplicar los parámetros de cadena de consulta?

Respuesta

14

Este comportamiento es por diseño del control de casilla de verificación. El control de casilla de verificación HTML estándar no pasa ningún valor si no está marcado. Esto no es intuitivo. En cambio, el control de casilla de verificación ASP.Net tiene 2 elementos, el control estándar que es visible y también un control oculto con un valor de 'False'.

Por lo tanto, si la casilla de verificación no está marcada, se pasará un valor: False.
Si está marcada, habrá dos valores, True y False. Por lo tanto, es necesario utilizar el siguiente código para comprobar la validez de su código:

bool checkboxChecked = Request.QueryString["MyCheckBox"].Contains("True"); 
+2

Interesante, pero ¿y si eres particular acerca de la pulcritud de la URL? ¿Se ve un poco tonto tener el parámetro dos veces? – pfeds

+0

Puede ser antiestético, pero el 99% de tu base de usuarios no lo entenderá. Si está realmente preocupado por la pulcritud de sus URL, puede pasar los datos por correo y crear una ruta específica para el formulario. –

+0

Sí, tienes razón. Lo dejaré como GET y dejaré de ser tan pedante. Muchas gracias Rory. – pfeds

3

respuesta aceptada es correcta sin embargo, en mi caso, en un desarrollo reciente del comportamiento MVC es engañosa.

El MVC Html.CheckBox(...) y Html.CheckBoxFor(...) generan una entrada adicional de 'tipo = oculto' con el mismo ID que el control de casilla de verificación, lo que lleva a los parámetros duplicados de URL. Tengo este problema simplemente incluyendo el margen de beneficio deseado de la siguiente manera:

@if(checkTrue){ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox" checked="checked"> 
}else{ 
    <input type="checkbox" id="MyCheckBox" name="MyCheckbox"> 
} 

sería mejor envuelto upin un ayudante para utilizar en lugar del código MVC por lo que el valor de verificación está encapsulado. Como parte de mi aplicación, el controlador mantiene conjuntos de parámetros de consulta usando inyección de formulario e inyección de enlace utilizando ayudantes para preservar el estado (de los controles de paginación/filtrado, por ejemplo) cuando se hace clic para navegar dentro del mismo alcance del controlador. Como resultado de esta característica, el elemento de casilla de verificación siempre se establece en falso si se utilizan los ayudantes MVC estándar. Es algo bueno que noté y no perdí mucho tiempo en este error.

+3

Su observación no es correcta, ASP.NET MVC genera una entrada adicional de tipo _hidden_ ​​y no _text_ cuando se utilizan los ayudantes CheckBoxFor. Ver http://stackoverflow.com/questions/2697299/asp-net-mvc-why-is-html-checkbox-generating-an-additional-hidden-input – janv8000

+0

@ janv8000 tienes razón, he corregido mi error gracias. – kas

1

En mi modelo, que tenía una colección de casillas de verificación, así:

public class PrerequisitesViewModel 
{ 
    public List<StudentPrerequisiteStatusViewModel> PrerequisiteStatuses { get; set; } 
} 

public class StudentPrerequisiteStatusViewModel 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public bool IsSelected { get; set; } 
} 

Con el fin de conseguir todo para unir correctamente, tenía que convertir en realidad los valores de la cadena de consulta y analizar de forma manual con el siguiente código:

// fix for how MVC binds checkboxes... it send "true,false" instead of just true, so we need to just get the true 
for (int i = 0; i < model.PrerequisiteStatuses.Count(); i++) 
{ 
    model.PrerequisiteStatuses[i].IsSelected = bool.Parse((Request.QueryString[$"PrerequisiteStatuses[{i}].IsSelected"] ?? "false").Split(',')[0]); 
} 

por desgracia, funciona, pero no puedo creer que esto es necesario en MVC! Con suerte, alguien más sabe de una mejor solución.

+0

Estoy de acuerdo, ¡debería ser innecesario en MVC! una cadena de consulta con una lista delimitada de las casillas de verificación activas debería ser suficiente, p. mycheckboxlist = 1,5,6,10 – andrew

Cuestiones relacionadas