Как отправить список int с jQuery в ASP.NET MVC Model Model Binder

Когда я отправляю список int с 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 всегда имеет значение null, кажется, что связующее устройство по умолчанию не может связывать его.

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


ADDED РЕШЕНИЕ

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

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

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

pkList:1
pkList:2
pkList:3

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

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

Ответы

Ответ 1

Вы можете использовать запрос 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 script на ваш сайт.

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

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

Ответ 2

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

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