2011-12-16 19 views
16
@Html.CheckBox("orderNumbers", new { value = 1 }) 
@Html.CheckBox("orderNumbers", new { value = 2 }) 
@Html.CheckBox("orderNumbers", new { value = 3 }) 
@Html.CheckBox("orderNumbers", new { value = 4 }) 
@Html.CheckBox("orderNumbers", new { value = 5 }) 

[HttpPost] 
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { } 

[HttpPost] 
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { } 

Si utilizo la primera firma en mi método de acción, obtengo un IEnumerable vacío.Vincular casillas de verificación a matriz int/enumerable en MVC

Si utilizo la segunda firma, recibo los valores pero también recibo un valor falso para los valores no seleccionados (debido al patrón MVCs de sombrear todas las casillas de verificación con un campo oculto).

p. Ej. Voy a recibir algo como orderNumbers = { "1", "2", "false", "4", "false" }

¿Por qué no puedo obtener la lista de números?

Respuesta

8

Porque así es como está trabajando el asistente proporcionado CheckBoxFor.

Debe generar el html para las casillas de verificación usted mismo. Entonces las entradas ocultas no se generan y obtendrá solo los valores enteros seleccionados.

+0

De hecho, por supuesto que sí. ¡Qué idiota! Había asumido erróneamente que habrían hecho algo inteligente en la carpeta de modelo para ignorar los valores falsos si no pudieran vincularse al tipo solicitado. – fearofawhackplanet

23

Puede obtener todos los valores comprobados de la siguiente manera.

código de controlador:

public ActionResult Index() 
    {    
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(string[] orderNumbers) 
    { 
     return View(); 
    } 

Ver código:

@using (Html.BeginForm()) 
{ 
    <input name="orderNumbers" type="checkbox" value="1" /> 
    <input name="orderNumbers" type="checkbox" value="2" /> 
    <input name="orderNumbers" type="checkbox" value="3" /> 
    <input name="orderNumbers" type="checkbox" value="4" /> 
    <input name="orderNumbers" type="checkbox" value="5" /> 

    <input type="submit" name="temp" value="hi" /> 
} 

Se le recuerda una cosa en mi mente que, es necesario dar mismo nombre a todas las casillas de verificación. En conjunto obtendrá valores para todas las casillas marcadas.

5

Además de la gran respuesta de alok_dida. Como todos los valores son enteros, puede hacer que su código de controlador tome una matriz de enteros y evite hacer la conversión usted mismo.

Esto funciona en MVC4 +:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(int[] orderNumbers) 
{ 
    return View(); 
} 
Cuestiones relacionadas