17

当我像这样使用 jQuery 发送一个 int 列表时:

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

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

pkList[]:1
pkList[]:2
pkList[]:3

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

public ActionResult Execute(ICollection<int> pkList)

但是pkList总是为null,好像默认的model binder无法绑定。

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


添加的 解决方案

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

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

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

pkList:1
pkList:2
pkList:3

并且 MVC 默认模型绑定器正确获取值。

希望这可以帮助某人。

4

3 回答 3

21

您可以使用 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
});
于 2011-10-28T17:16:21.400 回答
1

添加这个是因为@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();
}
于 2018-07-13T15:36:41.277 回答
0

Phil Haack 在他的博客上发表了一篇很棒的文章,应该可以为您指明正确的方向。

模型绑定到列表

于 2011-10-28T17:13:41.107 回答