为什么 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¶m2[]=2¶m2[]=3¶m2[]=4&=param2[]=5
ASP.NET MVC 不知道如何处理这种格式。通过将 traditional 设置为 true,我们保留了 ASP.NET MVC 期望的结构:
param2=1¶m2=2¶m2=3¶m2=4¶m2=5
编辑:
根据您构建数组的方式(attr returns 一个字符串),您最终将得到一个字符串数组,而不是数字,这意味着 MVC 不会反序列化您的数组。
您可以通过检查 idsOfRecordsToBeDeleted 的第一个元素来确认类型。
typeof(idsOfRecordsToBeDeleted[0])
将您的控制器方法更新为以下签名:
public virtual ActionResult Index( int param1, string[] param2)
这是我的 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¶m2[]=2¶m2[]=3¶m2[]=4&=param2[]=5
ASP.NET MVC 不知道如何处理这种格式。通过将 traditional 设置为 true,我们保留了 ASP.NET MVC 期望的结构:
param2=1¶m2=2¶m2=3¶m2=4¶m2=5
编辑: 根据您构建数组的方式(attr returns 一个字符串),您最终将得到一个字符串数组,而不是数字,这意味着 MVC 不会反序列化您的数组。
您可以通过检查 idsOfRecordsToBeDeleted 的第一个元素来确认类型。
typeof(idsOfRecordsToBeDeleted[0])
将您的控制器方法更新为以下签名:
public virtual ActionResult Index( int param1, string[] param2)