如何用jQuery发送一个int列表到ASP.net MVC默认模型绑定器



当我像这样发送一个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在他的博客上有一篇很棒的文章,应该会给你指明正确的方向。

模型绑定到列表

相关内容

  • 没有找到相关文章

最新更新