我有一个问题困扰着我,虽然它没有阻止我,因为我有一个解决方法。我正在尝试对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
为我做了诀窍,但我不知道为什么。某处有规格吗?
答案 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 Gu,WebMethod
要求AJAX请求为HTTP POST(除非禁用此保护),并包含内容类型HTTP标头application/json
。如果缺少该HTTP标头,ASP.NET将拒绝该请求。
由于该要求,$.get()
和$.post()
不起作用,因为它们是便利方法,并不总是包含所需的内容类型。因此,您需要使用$.ajax()
,因此始终可以发送内容类型HTTP标头。