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

Mar*_*arc 16 jquery defaultmodelbinder asp.net-mvc-3

当我用jQuery发送一个int列表时,如下所示:

$.ajax('@Url.Action("Execute")', {
    type: 'POST',
    data: {
        pkList: [1,2,3]
    }
});
Run Code Online (Sandbox Code Playgroud)

然后jQuery将转换pkList对象并通过post发送它,如下所示:

pkList[]:1
pkList[]:2
pkList[]:3
Run Code Online (Sandbox Code Playgroud)

如果服务器是PHP但是我使用Asp.NET MVC3并尝试使用默认模型绑定器获取这些值,这将是正常的:

public ActionResult Execute(ICollection<int> pkList)
Run Code Online (Sandbox Code Playgroud)

但是pkList总是为null,似乎默认的模型绑定器不能绑定它.

我该如何正确解决这个问题?


增加 解决方案

我使用Darin Dimitrov的解决方案traditional在jQuery中设置选项:

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

现在jQuery不再添加[]参数了,它们是这样发送的:

pkList:1
pkList:2
pkList:3
Run Code Online (Sandbox Code Playgroud)

MVC默认模型绑定器正确获取值.

希望这有助于某人.

Dar*_*rov 19

您可以使用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
    }
});
Run Code Online (Sandbox Code Playgroud)

JSON.stringify方法是在现代浏览器中构建的,如果您想支持旧版浏览器,可以将json2.js脚本包含在您的站点中.

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

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