当我发送一个int的列表与jQuery像这样:
$.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总是为空,似乎默认的模型binder不能绑定它.
如何正确解决?
我使用Darin Dimitrov的解决方案,在jQuery中设置了传统的选项:
$.ajax('@Url.Action("Execute")',traditional: true,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,3] }),// you could throw any javascript object you like here success: function(result) { // process the results } });
JSON.stringify方法内置于现代浏览器中,如果要支持旧版浏览器,则可以将json2.js脚本包含在您的站点中.
为了回答您的问题,您可以使用传统的:true选项来指示jQuery从传统的参数序列化到后退,因为在jQuery 1.4中已经发生变化,如果您使用的是更高版本,则可以将其重新切换回参数序列化:
$.ajax({ url: '@Url.Action("Execute")',3] },traditional: true });