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

上記の 3 つの関数は .Net 関数をトリガーしませんが、 and から "json" 部分を削除する$.post$.get、少なくともバックエンド関数が呼び出されますが、もちろん json は返されません。

また、理解できないのはばかげていると思う別の質問ですが、$.ajax関数で json 応答を取得すると、そのオブジェクト (ここでは と呼ばれますmsg) はどのように見えますか? msg.d私のためにトリックを行いますが、理由はわかりません。どこかに仕様はありますか?

4

2 に答える 2

2

まあ、それは「うまくいかない」だけですが、少なくともその理由はわかります。jquery の dev (非圧縮) バージョンをダウンロードし、事後関数にドリルダウンすると、内部的には機能する 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によると、AJAX リクエストは HTTP POST であるWebMethod必要があり (この保護を無効にしない限り)、コンテンツ タイプ HTTP ヘッダーが含まれていますapplication/json。その HTTP ヘッダーが欠落している場合、ASP.NET は要求を拒否します。

その要件のため$.get()、 と$.post()は、必要なコンテンツ タイプが常に含まれているとは限らない便利なメソッドであるため、機能しません。$.ajax()したがって、コンテンツ タイプの HTTP ヘッダーを常に送信できるように、を使用する必要があります。

于 2013-03-07T17:43:08.707 に答える