【问题标题】:Passing NESTED Complex json to MVC Controllers将 NESTED 复杂 json 传递给 MVC 控制器
【发布时间】:2014-06-06 00:52:26
【问题描述】:

注意:可能会敦促某些人将此标记为已回答的问题,但事实并非如此,我一直在寻找答案。这是“https://stackoverflow.com/questions/24027245/mvc-any-version-pass-nested-complex-json-object-to-controllers”的修改版,也没有回复。

问题:是否可以通过 jQuery ajax 调用将 JSON 数据发布到 MVC 控制器,其中您传递的数据是复杂类型,其中包含更复杂的类型?以数组数组为例。

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) {
    }
});

上面的 sn-p 是我对控制器 /Home/Save 的 jQuery ajax 调用,下面是控制器本身。请注意,我尝试过使用和不使用 traditional:true 选项。

[HttpPost]
public JsonResult Save(int[] arrayData, int[][] arrayOfarrayData)
{
    return Json("received");
}

这是我观察到的:

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

PS: 数组数组只是一个示例,似乎没有 NESTED 复杂类型起作用。或者有什么办法解决这个问题?

【问题讨论】:

    标签: jquery ajax asp.net-mvc json


    【解决方案1】:

    我认为您需要对数据进行字符串化

    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.strigify 使用 polyfill (github.com/douglascrockford/JSON-js)。
    • 另外,作为进一步的旁注,一旦你对数据进行字符串化,“传统”就无关紧要了——它对数据的处理方式绝对没有影响,但将其排除在外可能会减少误导,因为有它暗示它正在做某事。
    • @user3398887 很抱歉,但单独使用 stringify 并不能解决问题,但谢谢,我必须使用 stringify 和 contentType 然后它才起作用,你能否修改你的答案以包含 contentType 以便我可以将其标记为正确答案:)
    • @fyjham,感谢您的建议,是的,您对 traditional 的看法是正确的,我什至尝试过 :)
    • 很高兴知道这对您有用。答案已修改,您可以标记为正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2010-09-21
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多