使用 jQuery 的 $.ajax() 将多个 Json 对象作为数据传递
Posted
技术标签:
【中文标题】使用 jQuery 的 $.ajax() 将多个 Json 对象作为数据传递【英文标题】:Passing Multiple Json Objects as data using jQuery's $.ajax() 【发布时间】:2010-12-05 10:38:39 【问题描述】:我正在将数据发布到 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 数据作为单独的命名参数发送到查询字符串中。
当你使用 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
);
这个问题确实是因为我对这种类型的数据操作缺乏经验,我希望将来寻找这个的人可能会偶然发现这个。
谢谢!
丹
【问题讨论】:
感谢您的反馈!我非常感谢您为帮助我解决这个问题所做的努力。我的目标之一是避免将数据放在包装器数组中,我认为这可能是唯一可以使用内容类型“application/json;”的方法。字符集=utf-8'。我已经制定了一个解决方案,我将把它作为我的问题的附录发布。 仅供参考:data: "RoundingData=" + $.toJSON(data) + "&StateData=" + $.toJSON(stateData)
和 RoundingData:$.toJSON(data), StateData: $.toJSON(stateData)
被 jquery 以相同的方式解释。好吧,实际上您的查询字符串实际上将被转换为实际 XHR 的总体方案中的对象。通过执行 GET 调用并将查询字符串添加到实际 URL,您可以避免该问题,但我不明白它为什么重要(我相信您有充分的理由)。而且,很明显,GET 无论如何都不是语义正确的 HTTP。 /咆哮。
【参考方案1】:
据我所知,没有办法发回两个完全不同的 JSON 对象,它们不是单个父 JSON 对象的子对象,并让 jQuery 使用 .ajax()
方法为您解码它。我想你可以用两个 JSON 对象作为字符串进行回复,然后使用外部 JSON 库将字符串评估为 javascript 对象。
这能回答你的问题吗?
糟糕: 您问的是从 jquery 向您的控制器发布两个不同的 JSON 对象...,对吗?我的错...是的,您可以这样做...只需更改此行:
data: $.toJSON(data),
到:
data: json_1:$.toJSON(data_1), json_2:$.toJSON(data_2) ,
抱歉搞混了。
【讨论】:
【参考方案2】:如果我理解正确,功能性的话,你想发送
object 1,
object 2
相当于发送
[
object 1,
object 2
]
唯一的区别是前一种情况下的数组是隐式的,而后一种情况下是显式的。无论哪种方式,它仍然存在,但如果您想以 JSON 格式发送多个对象,则需要使用显式方法。
因此,将两个数据对象包装在一个数组中确实是理想的选择,但如果您的服务器代码不支持,您将需要一个替代方案。我能看到的唯一可能的方法是将两个数据对象放在另一个对象中,如下所示:
var data = ;
data[0] = data1;
data[1] = data2;
然后您通过 AJAX 调用发送data
。
我什至会说问题不在于您的方法,而在于接收端的 JSON 处理。
【讨论】:
【参考方案3】:如果你只想将多个数据发送到 webmethod,你可以在 asp.net 中以简单的方式完成此操作
data: 'userName: "' + $("#<%=txtUserName.ClientID%>")[0].value + '",userName1: "' + $("#<%=TextBox1.ClientID%>")[0].value + '" ',
【讨论】:
【参考方案4】:这是很久以后的答案,但可能对您将来的参考有所帮助。
我建议您阅读 this *** answer 直接解决您的问题。
【讨论】:
【参考方案5】:我认为你可以这样做:
var data = ;
var object1 = ;
var object2 = ;
data.object1 = object1;<br/>
data.object2 = object2;
// serializer
JSON2.stringify(data);
【讨论】:
以上是关于使用 jQuery 的 $.ajax() 将多个 Json 对象作为数据传递的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 和 Ajax 将多个文件字段保存到 django
如何将一个 ajax 数据源与多个 JQuery 数据表一起使用