2011-11-08 9 views
7

Tengo una llamada jQuery ajax en la que estoy tratando de enviar las identificaciones int de usuarios que se pueden seleccionar de una tabla de casillas de verificación.MVC con jQuery La llamada AJAX no vincula correctamente la matriz vacía/enumerable

Tengo un problema con el caso de que no hay usuarios seleccionados. Esperaría una matriz vacía, pero de hecho recibo una matriz de longitud = 1, que contiene ID de usuario 0 (es decir, un valor int sin asignar).

El siguiente fragmento reproduce el problema

$('#test').click(function() { 
    var numbers = $('.noElements').map(function() { 
     // (selector does not match any elements, to demonstrate) 
     return 1; 
    }).get(); 

    $.ajax({ 
     url: '/MyController/Test', 
     type: "GET", 
     data: { numbers: numbers, count: numbers.length } 
    }); 
}); 


public ActionResult Test(IEnumerable<int> numbers, int count) 
{ 
    Assert(numbers.Count() == count); 
    return null; 
} 

la aserción falla porque es numbersList<int> { 0 }. ¿Por qué la vinculación está sucediendo así?

+0

El código es poco confuso, que son números ajuste a "1", es decir numbers.Count() es 1. Pero, idealmente, cuando no se seleccionan usuarios, los números.Count() deberían ser idealmente "0". Y es entonces cuando la afirmación está fallando. Es esto correcto ? –

+0

¿Puedes probar el siguiente cambio en tu método de acción y ver si funciona o no? Reemplace IEnumerable con IList. Vea si funciona, si es así, entonces agregaré una respuesta detallada a esta publicación. –

+0

Numbers es una matriz de 0 longitudes de 1s. Cambiar de 'IEnumerable' a' IList' no hará ninguna diferencia. – fearofawhackplanet

Respuesta

1

Creo que el encuadernador de modelo predeterminado convertirá la cadena vacía que le pasa la llamada jQuery AJAX en una matriz entera que contiene un único elemento que contiene el valor predeterminado de un entero (0). Su código funcionaría si se hizo algo parecido a esto:

$('#test').click(function() { 
    var numbers = $('.noElements').map(function() { 
     return 1; 
    }); 
    if (numbers.length == 0) { 
     numbers = null; 
     count = 0; 
    } 
    else count = numbers.length; 

    $.ajax({ 
     url: '/Home/Test', 
     type: "GET", 
     data: { numbers: numbers, count: count } 
    }); 
}); 

Ver esta pregunta para obtener más información y soluciones alternas - How to post an empty array (of ints) (jQuery -> MVC 3)

+0

Sí, parece que no hay soporte en MVC para pasar una matriz vacía. Que extraño. Me pregunto cuál fue su razonamiento para implementarlo de esta manera, de todos modos no me resulta evidente de inmediato. – fearofawhackplanet

+0

En realidad, tuve que eliminar mi respuesta, porque en mi caso incluso las matrices no vacías se serializaron de forma incorrecta (mvc2) – Bartosz

Cuestiones relacionadas