代码之家  ›  专栏  ›  技术社区  ›  dano

使用jquery的$.ajax()将多个JSON对象作为数据传递

  •  7
  • dano  · 技术社区  · 16 年前

    我正在将数据发布到MVC控制器,并尝试维护状态以实现乐观并发。我目前正在发回一个JSON请求,但是否愿意接受可行的替代方案?

    我已使用以下命令发布名称/值集合:

    $.ajax({
        url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(),
        type: 'POST',
        dataType: 'html',
        data: $.toJSON(data), // <-- data = name/value array
        contentType: 'application/json; charset=utf-8',
        beforeSend: doSubmitBeforeSend,
        complete: doSubmitComplete,
        success: doSubmitSuccess
    });
    

    我还拥有一个(加密的)ID和时间戳数组,我想将其传递回去,以便服务器可以对其进行解密,然后在保存之前验证数据是否仍然是新的。

    数据对象是独立的,不是一个或另一个的子对象,也不是包装数组中的子对象,这一点非常重要(因为服务器端存在反射反序列化)。还需要注意的是,我希望异步执行此操作,并且 作为表单提交。

    我的问题是:是否有任何方法可以使用“application/json”作为内容类型来发回2个json对象?

    我的另一个问题是:有没有更好的/另一种方法可以做到这一点?

    事先谢谢!

    更新 :我解决了我的问题,将contentType参数更改为默认值,而不是将字符串化的Ajax数据作为单独的命名参数发送到queryString中。

    当您使用contenttype:'application/json;charset=utf-8'时,这会将数据推送到请求体中,而不是查询字符串中。我的新$.ajax()帖子现在看起来如下:

    $.ajax({
        url: g_appPath + "/Rounding.aspx/Round/" + $("#OfferId").val(),
        type: 'POST',
        dataType: 'html',
        data: "RoundingData=" + $.toJSON(data) + "&StateData=" + $.toJSON(stateData),
        // --removed! contentType: 'application/json; charset=utf-8',
        beforeSend: doSubmitBeforeSend,
        complete: doSubmitComplete,
        success: doSubmitSuccess
    });
    

    这个问题的产生是因为我对这种类型的数据操作缺乏经验,我希望将来有人会发现这一点。

    谢谢!

    5 回复  |  直到 13 年前
        1
  •  16
  •   KyleFarris    16 年前

    据我所知,没有办法返回两个完全不同的JSON对象,这些对象不是单亲JSON对象的子对象,并且让jquery使用 .ajax() 方法。我想,您可以使用两个JSON对象作为字符串进行回复,然后使用外部JSON库将字符串评估为一个JavaScript对象。

    那能回答你的问题吗?

    OOOps(OOOps): 您在询问从jquery向控制器发布两个不同的JSON对象,对吗?我的错。。。是的,你可以这样做…只需更改此行:

    data: $.toJSON(data),
    

    到:

    data: { json_1:$.toJSON(data_1), json_2:$.toJSON(data_2) },
    

    很抱歉弄混了。

        2
  •  1
  •   ShZ    16 年前

    如果我理解正确,功能性的话,你想发送

    object 1,
    object 2
    

    相当于发送

    [
        object 1,
        object 2
    ]
    

    唯一的区别是前一种情况下的数组是隐式的,后一种情况下是显式的。不管是哪种方式,它仍然存在,但是如果您想在JSON中发送多个对象,您需要使用显式方法。

    因此,将两个数据对象包装在一个数组中确实是一个理想的选择,但是如果您的服务器代码不支持,那么您将需要另一种选择。我能看到的唯一可行的方法是将两个数据对象放在另一个对象中,如下所示:

    var data = {};
    data[0] = data1;
    data[1] = data2;
    

    然后你发送 data 通过Ajax调用。

    我想说的是,问题不在于您的方法,而在于接收端的JSON处理。

        3
  •  1
  •   stealthyninja michkra    14 年前

    如果您只想将多个数据发送到WebMethod,可以在ASP.NET中用一种简单的方法执行此操作。

    data: '{userName: "' + $("#<%=txtUserName.ClientID%>")[0].value + '",userName1: "' + $("#<%=TextBox1.ClientID%>")[0].value + '" }',
    
        4
  •  0
  •   Community Mohan Dere    9 年前

    这是一个很长时间后的答案,但可能有助于您今后的任何参考。

    我建议你读 this stackoverflow answer 这直接解决了你的问题。

        5
  •  0
  •   Alfred redcoder    13 年前

    我想你可以这样做:

    var data = {};
    var object1 = {};
    var object2 = {};
    
    data.object1 = object1;<br/>
    data.object2 = object2;
    
    // serializer
    
    JSON2.stringify(data);