将嵌套复杂的JSON传递给MVC控制器

3
注意: 对于有些人来说,可能会认为这是已经回答过的问题,但实际上不是。我已经寻找答案很长时间了。这是一个修改过的版本,来源于 "https://stackoverflow.com/questions/24027245/mvc-any-version-pass-nested-complex-json-object-to-controllers" ,该问题同样没有得到答案。 问题: 通过jQuery AJAX调用向MVC控制器提交JSON数据时,是否可以传递复杂类型的数据,其中包含更多的复杂类型,例如数组嵌套数组?
var arrayOfarrays = [];
var simpleArray = [];

simpleArray[simpleArray.length] = simpleArray.length + 1;
simpleArray[simpleArray.length] = simpleArray.length + 1;
simpleArray[simpleArray.length] = simpleArray.length + 1;
simpleArray[simpleArray.length] = simpleArray.length + 1;
simpleArray[simpleArray.length] = simpleArray.length + 1;

arrayOfarrays[arrayOfarrays.length] = simpleArray;
arrayOfarrays[arrayOfarrays.length] = simpleArray;
arrayOfarrays[arrayOfarrays.length] = simpleArray;
arrayOfarrays[arrayOfarrays.length] = simpleArray;
arrayOfarrays[arrayOfarrays.length] = simpleArray;

上面是我的数据。如你所见,simpleArray只是一个简单的数组,而arrayOfarrays则是一个数组中包含多个数组的复杂嵌套类型。
$.ajax({
    url: '/Home/Save',
    data: {arrayData:simpleArray, arrayOfarrayData:arrayOfarrays},
    type: 'POST',
    dataType: 'json',
    traditional:true,
    cache: false,
    success: function (result) {
    }
});

上面的代码片段是我对控制器/Home/Save进行jQuery ajax调用,下面是控制器本身。请注意,我尝试过使用和不使用traditional:true选项。
[HttpPost]
public JsonResult Save(int[] arrayData, int[][] arrayOfarrayData)
{
    return Json("received");
}

这是我观察到的:
  • 使用traditional:true,我在/Home/Save控制器中接收到了一个简单的arrayData数组,但arrayOfarrayData为空。
  • 没有使用traditional:true,我接收到null作为arrayData,但arrayOfarrayData被接收为一个5个元素的数组,但这些元素不是你期望的子数组信息,而是空的。

备注:数组嵌套只是一个例子,似乎没有任何NESTED复杂类型可以工作。或者有其他解决方法吗?

1个回答

4

我认为你需要将数据转换为字符串

var dataToSend={
          'arrayData':simpleArray, 
          'arrayOfarrayData':arrayOfarrays
};

$.ajax({
    url: '/Home/Save',
    data: JSON.stringify(dataToSend),
    type: 'POST',
    contentType: 'application/json',
    dataType: 'json',
    traditional:true,
    cache: false,
    success: function (result) {
    }
});

这是正确的,但是顺便提一下,在旧浏览器上你可能需要一个JSON.stringify的polyfill(https://github.com/douglascrockford/JSON-js/)。 - fyjham
此外,作为进一步的附注,“传统”在字符串化数据时是无关紧要的 - 它对数据的处理没有任何影响,但省略它可能会减少误导,因为将其包含在其中暗示着它正在执行某些操作。 - fyjham
@user3398887 对不起,仅使用 stringify 无法解决问题,但是谢谢您的帮助。我需要使用 stringify 和 contentType,然后才能使其正常工作。请问您能否修改您的答案并包含 contentType,这样我就可以标记它为正确答案 :) - Lordbalmon
@fyjham,感谢您的建议,是的,您关于“traditional”的正确。我甚至尝试了一下 :) - Lordbalmon
很高兴知道这对你有用。答案已经被修改,你可以将其标记为正确的答案。 - Ammar Khan
一个问题!为什么我们要将简单数组发送到操作中,如果我们已经在数组的数组中拥有简单数组? 如果我想将嵌套的Json对象传递给Action,该怎么办?例如`用户对象内含有两个汽车对象? - Arslan Ameer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接