当我像这样发送一个int列表时:
$.ajax('@Url.Action("Execute")', {
type: 'POST',
data: {
pkList: [1,2,3]
}
});
然后jQuery将转换pkList对象并像这样通过post发送它:
pkList[]:1
pkList[]:2
pkList[]:3
这将是很好的,如果服务器是PHP,但我使用Asp。NET MVC3,并尝试使用默认模型绑定器获取这些值:
public ActionResult Execute(ICollection<int> pkList)
但是pkList总是null,似乎默认的模型绑定器不能绑定它。
如何正确解决这个问题?
添加
解决方案
我使用了Darin Dimitrov的解决方案,在jQuery中设置了traditional
选项:
$.ajax('@Url.Action("Execute")', {
type: 'POST',
traditional: true,
data: {
pkList: [1,2,3]
}
});
现在jQuery不再将[]
添加到参数中,它们是这样发送的:
pkList:1
pkList:2
pkList:3
MVC默认的模型绑定器得到正确的值。
您可以使用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();
}
Phil Haack在他的博客上有一篇很棒的文章,应该会给你指明正确的方向。
模型绑定到列表