【问题标题】:Jquery getJSON not working, but ajax doesJquery getJSON 不起作用,但 ajax 可以
【发布时间】:2013-03-07 16:41:48
【问题描述】:

我有一个问题困扰着我,但它并没有阻止我,因为我有一个解决方法。我正在尝试对我在 aspx 页面上的页面方法进行 ajax 调用。我需要取回 json,但 WebMethod GetGender 永远不会被调用,除非我使用 $.ajax 调用。

所以,这个工作:

    $.ajax({
        type: "POST",
        url: "StudentFunctions.aspx/GetGender",
        data: "{}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            var data = google.visualization.arrayToDataTable(msg.d);
            var options = {
              title: 'Gender',
              height: '5000px'
            };

            var chart = new google.visualization.PieChart(document.getElementById("chart_div"));
            chart.draw(data, options);
        }
    }); 

但是,以下都不起作用:

$.get("StudentFunctions.aspx/GetGender", function(msg) { 
        alert(msg)
     }, "json");

$.post("StudentFunctions.aspx/GetGender", function(msg) { 
        alert(msg)
     }, "json");

$.getJSON("StudentFunctions.aspx/GetGender", function(msg) { 
        alert(msg)
     });

上面的三个函数甚至不会触发.Net函数,但是如果我从$.post$.get中删除“json”部分,它们至少会调用后端函数,但当然不会'不返回 json。

另外,另一个我不理解的问题我觉得很愚蠢,但是当我在$.ajax函数中得到json响应时,那个对象(这里称为msg)是什么样的? msg.d 对我有用,但我不知道为什么。某处有规范吗?

【问题讨论】:

  • 当您使用$.ajax 时,响应对象是什么样的?你能把它放在这里吗?
  • 看看encosia.com/…encosia.com/using-jquery-to-consume-aspnet-json-web-services。它解释了为什么需要完整的$.ajax() 方法。
  • @StevenVondruska 谢谢,这就解释了。似乎 ASP.NET 框架也需要 contentType。此外,在您发送的页面中深入了解一下,我得到了 msg.d 问题的答案。如果您想形式化答案,我会将您标记为正确的。否则我以后可能会写一些东西。
  • 我添加了一个答案,以便其他人可以从中受益!
  • 谢谢,我对来自两个不同 Stevens 的回答感到有些困惑。谢谢你们俩!

标签: jquery asp.net ajax json


【解决方案1】:

这是假设从 jQuery 调用的函数是 WebMethod

根据Scott GuWebMethod 要求AJAX 请求是HTTP POST(除非禁用此保护),并包含内容类型HTTP 标头application/json。如果该 HTTP 标头丢失,ASP.NET 将拒绝该请求。

由于该要求,$.get()$.post() 不起作用,因为它们是不总是包含所需内容类型的便捷方法。所以需要使用$.ajax(),这样内容类型的HTTP头总是可以发送的。

【讨论】:

    【解决方案2】:

    嗯,它“只是行不通”,但至少我可以告诉你原因。如果您下载 jquery 的开发(非压缩)版本并深入研究 post 函数,您会发现在内部它只是一个帮助函数来调用有效的 ajax 函数。但是,它包含 contentType,也不允许您设置它!这是代码:

        return jQuery.ajax({
            url: url,
            type: method,
            dataType: type,
            data: data,
            success: callback
        });
    

    如您所见,没有 contentType。您可以通过从 ajax 方法中删除 contentType 来复制相同的失败。所以你有它 - 但至少你知道除了稍微漂亮的代码之外你没有丢失任何东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多