【问题标题】:Difference Between $.getJSON() and $.ajax() in jQueryjQuery 中 $.getJSON() 和 $.ajax() 的区别
【发布时间】: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 调用用于一些高级回调。

任何想法表示赞赏。

【问题讨论】:

    标签: asp.net-mvc jquery


    【解决方案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()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          • 1970-01-01
          • 2017-08-29
          • 1970-01-01
          相关资源
          最近更新 更多