jQuery 中 $.getJSON() 和 $.ajax() 的区别
Posted
技术标签:
【中文标题】jQuery 中 $.getJSON() 和 $.ajax() 的区别【英文标题】:Difference Between $.getJSON() and $.ajax() in jQuery 【发布时间】:2010-11-07 17:47:54 【问题描述】:我正在调用 ASP.NET MVC 操作
public JsonResult GetPatient(string patientID)
...
来自使用 jQuery 的 javascript。以下调用有效
$.getJSON(
'/Services/GetPatient',
patientID: "1" ,
function(jsonData)
alert(jsonData);
);
而这个没有。
$.ajax(
type: 'POST',
url: '/Services/GetPatient',
data: patientID: "1" ,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(jsonData)
alert(jsonData);
,
error: function()
alert('Error loading PatientID=' + id);
);
两者都达到了操作方法,但在 $.ajax 调用下,患者 ID 值为 null。我想将 $.ajax 调用用于一些高级回调。
任何想法表示赞赏。
【问题讨论】:
【参考方案1】:内容类型
您无需在调用 MVC 控制器操作时指定该内容类型。只有在调用 ASP.NET AJAX“ScriptServices”和页面方法时才需要特殊的“application/json; charset=utf-8”内容类型。 jQuery 的默认 contentType “application/x-www-form-urlencoded” 适合请求 MVC 控制器操作。
在此处了解有关该内容类型的更多信息:JSON Hijacking and How ASP.NET AJAX 1.0 Avoids these Attacks
数据
数据是正确的。通过向 jQuery 传递一个 JSON 对象,正如您所拥有的,它将在 POST 数据中序列化为 patientID=1。这种标准形式是 MVC 期望参数的方式。
当您使用 ASP.NET AJAX 服务时,您只需将参数用引号括起来,例如“ 'patientID' : 1 ”。他们希望解析出表示 JSON 对象的单个字符串,而不是 POST 数据中的各个变量。
JSON
在这种特定情况下这不是问题,但养成在 JSON 对象中引用任何字符串键或值的习惯是个好主意。如果您无意中将 JavaScript 保留关键字用作对象中的键或值,而没有引用它,则会遇到令人困惑的调试问题。
相反,您不必引用数字或布尔值。直接在对象中使用它们总是安全的。
因此,假设您确实想要 POST 而不是 GET,您的 $.ajax() 调用可能如下所示:
$.ajax(
type: 'POST',
url: '/Services/GetPatient',
data: 'patientID' : 1 ,
dataType: 'json',
success: function(jsonData)
alert(jsonData);
,
error: function()
alert('Error loading PatientID=' + id);
);
【讨论】:
谢谢。这解决了问题。我使用 $.compactJSON() 将 JS 对象格式化为 JSON 作为数据选项。 由于 $.compactJSON 在 jQuery 中不再可用,我在此插件中使用了 $.toJSON:code.google.com/p/jquery-json【参考方案2】:.getJson 只是 .ajax 的一个包装器,但它提供了一个更简单的方法签名,因为某些设置是默认设置的,例如 dataType 为 json,类型为 get 等
注意,.load、.get 和 .post 也是 .ajax 方法的简单包装器。
【讨论】:
【参考方案3】:替换
data: patientID: "1" ,
与
data: " 'patientID': '1' ",
延伸阅读:3 mistakes to avoid when using jQuery with ASP.NET
【讨论】:
那不是必须像 data: ' patientID: "1" ',以避免嵌套双引号吗? 不行。此更改的操作方法中的值为 null。 尝试删除您指定的 contentType 设置 我认为方法参数必须与 JSON 键相同。即个人ID。除此之外,我不确定问题所在,因为我已经多次使用此语法并且它没有问题。 必须手动执行此操作很糟糕,因此我建议使用code.google.com/p/jquery-json - 这可以让您使用 $.compactJSON() 方法包装您的真实 JSON 对象,该方法会自动将对象作为字符串发送,全面减少头痛。【参考方案4】:jquery 的一些函数如 $.ajax、$.get、$.post、$.getScript、$.getJSON 有很多混淆,它们之间有什么区别,哪个是最好的,哪个是快速,使用哪个以及何时使用下面是它们的描述,以使它们清晰并摆脱这种类型的混淆。
$.getJSON() 函数是一个简写的 Ajax 函数(内部使用 $.get() 和数据类型脚本),相当于下面的表达式,使用一些有限的标准,例如请求类型是 GET,数据类型是 json。
阅读更多 ..jquery-post-vs-get-vs-ajax
【讨论】:
有人删除了链接,没有它这个答案毫无意义,所以我把它回滚了。【参考方案5】:我看到的唯一区别是 getJSON 执行的是 GET 请求而不是 POST。
【讨论】:
尝试将类型改为GET,rpcutts answer中的数据发生变化,但action方法中的值仍然为null。【参考方案6】:contentType: 'application/json; charset=utf-8'
不好。至少它对我不起作用。其他语法没问题。您提供的参数格式正确。
【讨论】:
【参考方案7】:使用 $.getJSON()) 没有任何错误回调,只有您可以跟踪成功回调,并且不支持诸如 beforeSend、statusCode、mimeType 等标准设置,如果您希望使用 $.ajax()。
【讨论】:
以上是关于jQuery 中 $.getJSON() 和 $.ajax() 的区别的主要内容,如果未能解决你的问题,请参考以下文章
深入理解jQuery中$.get$.post$.getJSON和$.ajax的用法
理解jQuery中$.get$.post$.getJSON和$.ajax的用法