4

私はjquery ajaxによってそれを呼び出すwebmethodを持っています.in web method私はリピーターデータソースをpagedatasourseオブジェクトにバインドしますが、メソッド名の前に静的キーワードwebmethodeを使用しない場合、プログラムを実行するとjquery ajaxメソッドが正しく機能せず、使用する場合static キーワード 私はこのエラーがあります

オブジェクト参照がオブジェクトのインスタンスに設定されていません....System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。

と pagedatasourse は例外に分類されます。私は混乱しています。解決策は何ですか? 私のjquery関数に感謝します

 $(function () {
            var x = 0;
            $('.c1').bind('click', function () {

                counter = counter + 1;
                $.ajax(
                {
         type: "POST",
            url: "WebForm1.aspx/bringdata",
      data: { counter: counter },
          contentType: "application/json; charset=utf-8",
           dataType: "json",
           async: true,
            cache: false,
              success: function (ret) {

                alert("success");
           },
           error: function (x, e) {
           alert("error ");
                 }
                   }
                );

            })
            $('.c2').bind('click', function () {

                x = x - 1;

            })

        })

およびその背後にあるコード:

  [WebMethod]
  public  static void bringdata(int counter){
   SqlConnection con = new SqlConnection("data source=.;database=site;integrated   security=true;");
   int cnt;
   string sSQL = "Select username ,average,weight,point,password ,kal, Rank() over(order    by point desc) as 'ranking' from karbar order by point desc";  
   SqlCommand cmd = new SqlCommand(sSQL, con);  

   SqlDataAdapter adapt = new SqlDataAdapter(cmd);
   DataSet ds = new DataSet();
   adapt.Fill(ds);
   cnt=ds.Tables[0].Rows.Count;
   PagedDataSource pds = new PagedDataSource();
   pds.AllowPaging=true;
   pds.DataSource=ds.Tables[0].DefaultView;
   pds.PageSize=5;
   pds.CurrentPageIndex=counter;
   int vcnt=cnt/pds.PageSize;
   rptList.DataSource = pds;  
   rptList.DataBind(); 

}

4

3 に答える 3

3

なぜ例外が発生するのですか?

前のリクエストの結果をページングしようとしている間に、APS.NET が各リクエストの後に DataSet (ここには表示されていません) を破棄するためです。DataSet を静的にすると (ASP.NET では大したことではありません)、データセットはメモリに保持され、すべての要求間で共有されます。

これを修正する方法は?

不適切なデータ アクセス パターンを使用しています。データセットは非常に厄介で、実際には ASP.NET で使用するべきではありません。

  • DataSet を完全に取り除きます。静的オブジェクトを使用しないでください。アプリケーションへのトラフィックが発生すると、奇妙なバグが発生します。
  • など、より軽量なものを使用して、List<Record>を入力しDataReaderます。
  • インメモリページングではなく、データベースページングを使用します。データベース サーバーにすべてのデータを取得するように依頼しないでください。そうしないと、アプリがダウンします (トラフィックが発生してデータベースが大きくなった場合)。
  • ORM (NHibernate や EF など) の使用を検討してください。多くの魔法がかかります。
于 2012-08-03T09:40:19.043 に答える
0

まず、オブジェクトを作成せずに直接呼び出すため、Web メソッドは静的でなければなりません。2 つ目は、Web メソッドでサーバー側のコントロールに直接アクセスできないことです。

ここでは、クライアント側でデータ ソースを取得し、それをクライアント側のリピーターにバインドできます。

success: function (ret) {

            // here get the datasource as "ret".
            // bind the repeater with the data source manually.
     }

また

コントロールを更新パネル内に配置すると、クライアント側のデータバインドは必要なく、jQueryでのajax呼び出しも必要ありません。

于 2012-08-03T09:29:03.693 に答える
0

メンバーが null です。rptList使用する前に新しい rptList を作成してください

于 2012-08-03T11:54:53.110 に答える