如何使用jQuery将int列表发送到ASP.net MVC Default Model Binder

当我用jQuery发送一个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 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脚本包含在您的站点中。

要回答你的问题你可以使用set the traditional: true选项来指示jQuery回退到传统的参数序列化,因为在jQuery 1.4中已经改变了,如果你使用的是更高版本,你有可能切换回方式参数是序列化的:

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

Phil Haack在他的博客上有一篇很棒的文章,应该直截了当地指出你。

模型绑定到列表

添加这个是因为@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 list) { return View(); }