2

我有一个困扰着我的问题,尽管因为我有一个解决方法,它并没有阻止我。我正在尝试对我在 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 函数,但是如果我从$.postand中删除“json”部分$.get,它们至少会调用后端函数,但当然不会返回 json。

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

4

2 回答 2

2

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

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

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

于 2013-03-07T17:28:10.840 回答
2

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

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

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

于 2013-03-07T17:43:08.707 回答