MVC с вызовом jQuery Ajax неправильно связывает пустой массив / перечислимый - PullRequest
7 голосов
/ 08 ноября 2011

У меня есть вызов jQuery ajax, в котором я пытаюсь отправить int ID пользователей, которые можно выбрать из таблицы флажков.

У меня проблема с тем, что ни один пользователь не выбран,Я ожидал бы пустой массив, но на самом деле я получаю массив длины = 1, содержащий userId 0 (т.е. неназначенное значение типа int).

Следующий фрагмент кода воспроизводит проблему

$('#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;
}

Утверждение не выполняется, потому что numbers равно List<int> { 0 }.Почему привязка происходит так?

1 Ответ

1 голос
/ 08 ноября 2011

Я полагаю, что связыватель модели по умолчанию преобразует пустую строку, переданную ему вызовом jQuery AJAX, в целочисленный массив, содержащий единственный элемент, содержащий значение по умолчанию целого числа (0). Ваш код будет работать, если вы сделаете что-то вроде этого -

$('#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 }
    });
});

См. Этот вопрос для получения дополнительной информации и альтернативных решений - Как разместить пустой массив (с целыми числами) (jQuery -> MVC 3)

...