MVC con la llamada jQuery Ajax no enlaza correctamente la matriz vacía / enumerable

Tengo una llamada jQuery ajax en la que estoy tratando de enviar los ID de int de los usuarios que se pueden seleccionar de una tabla de casillas de verificación.

Tengo un problema con el caso de que no se seleccione ningún usuario. Esperaría una matriz vacía, pero de hecho recibo una matriz de length = 1, que contiene userId 0 (es decir, un valor int no asignado).

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 afirmación falla porque numbers is List<int> { 0 }. ¿Por qué la unión ocurre así?

preguntado el 08 de noviembre de 11 a las 13:11

El código es un poco confuso, está estableciendo números en "1", es decir, numbers.Count () es 1. Pero lo ideal es que cuando no se seleccionen usuarios, los números.Count () deberían ser idealmente "0". Y entonces la afirmación está fallando. Es esto correcto ? -

¿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í, agregaré una respuesta detallada a esta publicación. -

Numbers es una matriz de 0s de longitud 1. Cambiando de IEnumerable a IList no hará ninguna diferencia. -

1 Respuestas

Creo que el enlazador de modelos predeterminado convertirá la cadena vacía que se le pasa por la llamada jQuery AJAX en una matriz de enteros que contiene un solo elemento que contiene el valor predeterminado de un entero (0). Su código funcionaría si hiciera algo como 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 }
    });
});

Consulte esta pregunta para obtener más información y soluciones alternativas: Cómo publicar una matriz vacía (de entradas) (jQuery -> MVC 3)

contestado el 23 de mayo de 17 a las 15:05

Sí, parece que MVC no admite el paso de una matriz vacía. Que extraño. Me pregunto cuál fue su razonamiento para implementarlo de esta manera, de todos modos no es evidente para mí de inmediato. - Miedo a un planeta

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

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.