0

Visual Studio 2008 に ASP Web アプリケーションがあります。フォルダに jquery-1.10.2.js があります - JavaScriptBase

ソリューション内のファイル 1. Dashboard.aspx 2. JavaScripts/Dashboard.js

jQueryタブがあります

<li><a href="#tabs-1" id="tab1" runat="server" onclick="GetData(0)">Today</a></li>
<li><a href="#tabs-2" id="tab2" runat="server" onclick="GetData(7)">1-7 days</a></li>
<li><a href="#tabs-3" id="tab3" runat="server" onclick="GetData(30)">30 days</a></li>
<li><a href="#tabs-4" id="tab4" runat="server" onclick="GetData(60)">60 days</a></li>
<li><a href="#tabs-5" id="tab5" runat="server" onclick="GetData(90)">90 days</a></li>
<li><a href="#tabs-6" id="tab6" runat="server" onclick="GetData(180)">180 days</a></li>

GetData() 関数は、フォルダー JavaScripts の Dashboard.js 内にあります。

function GetData(ky)
{
var params = "{'days' : '" + ky + "'}";   // if no params need to use "{}"
alert(params);
        $.ajax({
            url: "Dashboard.aspx/getDataByDate",
            type: 'POST',
            data: params,
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, status) {
                loadSuccess(data, status);
            },
            error: function () {
                alert("Oops! It's an Error");
            }
        });

        return false;
}

私のコードビハインド

public string getDataByDate(string days)
        {
            DataSet ds = new DataSet();
            ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
            return ds.GetXml();
        }

関数を呼び出すと、常にエラー関数に移動します。

js ファイルから分離コード内の関数を呼び出す方法。助けてください...

編集1

Grundyの提案に従ってcsコードを変更します

[WebMethod()]
public string getDataByDate(string days)
{
DataSet ds = new DataSet();
ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
return ds.GetXml();
}

まだ届かない..

4

3 に答える 3

2

ここで気づいたことは 2 つあります。JSON である必要があるときにコード ビハインド メソッドから XML を返していることと、data.d について知る必要がある場合があります。

まず、 XML を JSON に簡単にシリアル化するために、非常に人気があり堅牢なJSON.NET ライブラリが必要です。System.Web.Script.Serialization.JavaScriptSerializer (どちらも使用していないことはわかっています) が XML から JSON を処理するように構築されているとは思わないため、NUGET を使用して JSON.NET ライブラリを追加すると、コード ビハインドは次のようになります。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static object getDataByDate(string days)
{
    DataSet ds = new DataSet();
    ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
    string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(ds.GetXml());
    return json;
}

.NET 3.5 を使用している場合は、Web サービスではなくコード ビハインド メソッドを使用していても、念のために "d" を理解する必要があります。

「これは、ASP.NET 3.5 の ASP.NET AJAX 拡張機能を介してシリアル化されたすべての ASMX サービスの JSON に当てはまります。文字列、int、またはブール値などのスカラーの戻り値のみを返す場合でも、結果は常に「d」で囲みます。」参照: http://encosia.com/a-breaking-change-between-versions-of-aspnet-ajax/

したがって、.NET 3.5 を使用している場合、jQuey.ajax 成功コールバックの実装は次のようにする必要があります。

loadSuccess(data.d, status);

.NET 4.0 以降を使用している場合は、「d」について心配する必要はありません。

この実装を Web サービスに移行することを検討する必要があります。これは、回答に含めたコードとほぼ同じになります。Web サービスは、ajax 呼び出しのためのプロジェクト内のコードのより適切な構成であり、Web サービスは、コード ビハインドからよりも ajax 要求と応答の解析を処理するのにより適しているように見えますが、後者は推測であり、ASP.NET は WebMethod 属性を持つメソッドを処理する場合があります。コード ビハインドでも Web サービスでもまったく同じ方法ですが、コード ビハインドではなく Web サービスに getDataByDate を実装する十分な理由はコードの構成です。複数のページで呼び出されます。実装は非常に簡単です。services フォルダーを作成し、新しい Web サービスを追加し、好きな名前を付けるだけです。キーワード staticを削除し、ajax URL を「/services/[yourwebserivcename].asmx/getDataByDate」に変更します。

PS、私は自分のコードが Web サービスで動作することを知っていますが、コード ビハインドからはわかりませんが、動作するはずです。

PSS はパブリック メソッドであるため、Web メソッドを Captialize する方が適切であるため、getDataByDate は GetDataByDate にする必要があります。

于 2013-11-05T08:28:04.243 に答える
1

この (getDataByDate) メソッドでWebMethod属性を使用してみてください

アップデート

次のようにメソッドを変更してみてください。

[WebMethod,ScriptMethod(...params if need...)]
public static string getDataByDate(string days)
{
    DataSet ds = new DataSet();
    ds = getPatientVisitCount(DateTime.Today.ToString(), DateTime.Today.ToString()));
    return ds.GetXml();
}

ScriptMethodも参照してください

于 2013-11-05T06:14:13.000 に答える
1

それ以外の

var params = "{'days' : '" + ky + "'}";

使用する

var params = {};
params.days = ky;

$.ajax({
            url: "Dashboard.aspx/getDataByDate",
            type: 'POST',
            data: JSON.stringify(params),
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            success: function (data, status) {
                loadSuccess(data, status);
            },
            error: function () {
                alert("Oops! It's an Error");
            }
        });

また、URL パスが正しいことを確認してください。「../」を使用して、現在のフォルダー「../Dashboard.aspx/getDataByDate」から抜け出すことができます

于 2013-11-05T06:46:56.240 に答える