4

我有一个通过 jquery ajax 调用它的 webmethod .in web 方法我将转发器数据源绑定到 pagedatasourse 对象但是当我运行我的程序时,如果我在方法名称之前不使用静态关键字 webmethode jquery ajax 方法不能正常工作并且如果使用静态关键字我有这个错误

对象引用未设置为对象的实例....System.NullReferenceException:对象引用未设置为对象的实例。

和 pagedatasource 属于异常。我很困惑。什么是解决方案?非常感谢它是我的 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 方法必须是静态的,因为我们直接调用它们而不创建任何对象。第二件事是我们不能直接在 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

rptList成员为空,请在尝试使用之前创建一个新的 rptList

于 2012-08-03T11:54:53.110 回答