2013-03-07 119 views
2

我有一个问题困扰着我,虽然它没有阻止我,因为我有一个解决方法。我正在尝试对我在aspx页面上的页面方法进行ajax调用。我需要返回json,但WebMethod GetGender从未被调用,除非我使用$.ajax调用。Jquery getJSON不工作,但阿贾克斯

所以,这个工作:

$.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) 
    }); 

的三个功能上面甚至没有触发净功能,但如果我删除“json”部分来自$.post$.get,它们至少会调用后端函数,但是当然不会返回json。

此外,另一个我不明白的愚蠢问题,但是当我在$.ajax函数中得到json响应时,该对象(这里称为msg)是什么样的? msg.d为我做了诡计,但我不知道为什么。是否有规范?

+0

当您使用'$ .ajax'时,响应对象的外观如何?你能把它放在这里吗? – udidu 2013-03-07 16:45:00

+1

查看http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/和http://encosia.com/using-jquery-to-consume-aspnet- JSON的Web服务/。它解释了为什么需要完整的'.ajax()'方法。 – 2013-03-07 16:46:43

+0

@StevenVondruska谢谢,这解释了它。好像ASP.NET框架也需要contentType。另外,在发送的页面中钻取一点让我知道msg.d问题的答案。如果你想正式确定答案,我会给你贴上正确的标签。否则,我可能会在稍后写点东西。 – 2013-03-07 17:17:51

回答

2

这是假设从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来复制相同的失败。所以你有它 - 但至少你知道除了稍微漂亮的代码之外你不会损失任何东西。