Как отправить список int с помощью jQuery в ASP.net MVC Binder модели по умолчанию
Когда я отправляю список целых с 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 ответа
Вы можете использовать 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
});
Добавление этого, потому что @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();
}
У Фила Хаака есть отличная статья в своем блоге, которая должна направить вас в нужное русло.