Как отправить список int с помощью jQuery в ASP.net MVC Binder модели по умолчанию - PullRequest
16 голосов
/ 28 октября 2011

Когда я отправляю список целых с jQuery, как это:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    data: {
        pkList: [1,2,3]
    }
});

Затем jQuery преобразует объект pkList и отправит его по почте следующим образом:

pkList[]:1
pkList[]:2
pkList[]:3

Что было бы хорошо, если сервер PHP, но я использую Asp.NET MVC3 и пытаюсь получить эти значения с помощью связывателя модели по умолчанию:

public ActionResult Execute(ICollection<int> pkList)

Но pkList всегда равен нулю, похоже, что механизм связывания модели по умолчанию не может связать его.

Как мне решить это правильно?


ДОБАВЛЕНО РЕШЕНИЕ

Я использовал решение от Дарина Димитрова с настройкой опции traditional в jQuery:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    traditional: true,
    data: {
        pkList: [1,2,3]
    }
});

Теперь jQuery больше не добавляет [] к параметрам, и они отправляются так:

pkList:1
pkList:2
pkList:3

И связыватель модели MVC по умолчанию получает значения правильно.

Надеюсь, это кому-нибудь поможет.

Ответы [ 3 ]

19 голосов
/ 28 октября 2011

Вы можете использовать JSON-запрос, поскольку он позволит вам отправлять любые сложные объекты по вашему желанию:

$.ajax({
    url: '@Url.Action("Execute")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({ pkList: [1, 2, 3] }), // you could throw any javascript object you like here
    success: function(result) {
        // process the results
    }
});

Метод JSON.stringify встроен в современные браузеры, и если вы хотите поддерживать устаревшие браузеры, вы можете добавить на свой сайт скрипт json2.js .

И чтобы ответить на ваш вопрос, вы можете использовать опцию traditional: true, чтобы указать jQuery возврат к традиционной сериализации параметров, поскольку это изменилось в jQuery 1.4, и если вы используете более позднюю версию, иметь возможность вернуться к способу сериализации параметров:

$.ajax({ 
    url: '@Url.Action("Execute")',
    type: 'POST',
    data: {
        pkList: [1, 2, 3]
    },
    traditional: true
});
0 голосов
/ 13 июля 2018

Добавление этого, потому что @Darin пропускает действие контроллера.

Код сценария Java:

function sendArray() {
    var list = ["a", "b"];

    $.ajax({
        url: '@Url.Action("ActionName")',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ list }),
        dataType: "json",
        success: function (response) {},
        error: function (response) {}
    });
}

Код C #

[HttpPost]
public ActionResult ActionName(List<string> list)
{
    return View();
}
0 голосов
/ 28 октября 2011

У Фила Хаака есть отличная статья в своем блоге, которая должна указать вам правильное прямое направление.

Привязка модели к списку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...