Jquery getJSON无法正常工作,但是ajax可以

时间:2013-03-07 16:41:48

标签: jquery asp.net ajax json

我有一个问题困扰着我,虽然它没有阻止我,因为我有一个解决方法。我正在尝试对aspx页面上的页面方法执行ajax调用。我需要让json回来,但除非我使用GetGender调用,否则永远不会调用WebMethod $.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为我做了诀窍,但我不知道为什么。某处有规格吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

这假设来自jQuery的被调用函数是WebMethod

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

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