为什么 ajax 调用不绑定到 int[] 与 jquery .post()

Why ajax call doesn't bind to int[] with jquery .post()

这是我的 ajax 电话:

var idsOfRecordsToBeDeleted = [];

        $("#container :checked").each(
            function (index) {
                idsOfRecordsToBeDeleted.push($(this).attr('id'));
            });
var parametersList = { param1: 123456, param2: idsOfRecordsToBeDeleted  };

$.post("/Home/Index", parametersList, function (returnedData) {
    alert(returnedData);
});

还有我的控制器:

[Authorize]
[HttpPost]
public virtual ActionResult Index( int param1, int[] param2)
{
    return null;
}

并且 param1 可以,但 param2 始终为空。你能帮忙吗?

将数组序列化为字符串,然后在服务器上反序列化。

客户:

param2: [1, 2, 3, 4].join(',');

服务器(将 param2 类型更改为 string 而不是 int[]):

int[] param2Parsed = param2.Split(',').Select(s => int.Parse(s)).ToArray();

您可以为您的 jQuery post 打开传统模式以允许浅数组序列化。

jQuery.ajaxSettings.traditional = true;
var parametersList = { param1: 123456, param2: [1, 2, 3, 4] };

$.post("/Home/Index", parametersList, function (returnedData) {
    alert(returnedData);
});

如果您只想将传统模式应用于此 post,您可以使用 $.ajax.

添加它
var parametersList = { param1: 123456, param2: [1, 2, 3, 4] };
$.ajax({ 
    url: "/Home/Index",
    type: 'POST',
    data: parametersList
    traditional: true
});

自 jQuery 1.8 起,ajax 调用将通过默认 traditional flag 为 false 递归序列化所有对象。

因此,深层对象最终被序列化为表示此对象结构的字符串:

param2[]=1&param2[]=2&param2[]=3&param2[]=4&=param2[]=5

ASP.NET MVC 不知道如何处理这种格式。通过将 traditional 设置为 true,我们保留了 ASP.NET MVC 期望的结构:

param2=1&param2=2&param2=3&param2=4&param2=5

编辑: 根据您构建数组的方式(attr returns 一个字符串),您最终将得到一个字符串数组,而不是数字,这意味着 MVC 不会反序列化您的数组。

您可以通过检查 idsOfRecordsToBeDeleted 的第一个元素来确认类型。

typeof(idsOfRecordsToBeDeleted[0])

将您的控制器方法更新为以下签名:

public virtual ActionResult Index( int param1, string[] param2)