【问题标题】:call webmethod from jquery ajax and problemm with static object从 jquery ajax 调用 webmethod 并使用静态对象进行问题
【发布时间】:2012-08-03 09:22:37
【问题描述】:

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

对象引用未设置为对象的实例....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(); 

}

【问题讨论】:

  • 我认为问题出在您的网络方法中。你有整个例外吗?
  • hi.problem 是静态 keword.and 它的例外:对象引用未设置为对象的实例。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。源错误:第 67 行:rptList.DataSource = pds;第 68 行:rptList.DataBind();第 69 行:

标签: c# jquery asp.net c#-4.0 c#-3.0


【解决方案1】:

为什么会出现异常?

我的猜测是,因为 APS.NET 会在每次请求后处理 DataSet(此处未显示),而您正在尝试从上一个请求中分页结果。如果你创建一个 DataSet static(在 ASP.NET 中这是一个很大的禁忌),那么它会保存在内存中,并在所有请求之间共享。

如何解决这个问题?

您使用了不正确的数据访问模式。数据集真的很糟糕,实际上不应该与 ASP.NET 一起使用。

  • 彻底摆脱DataSet。不要使用静态对象,当您的应用程序获得一些流量时,您会看到真正奇怪的错误。
  • 使用更轻量级的东西,例如 List<Record> 并使用 DataReader 填充它。
  • 使用数据库分页,而不是内存中分页。永远不要让数据库服务器带上所有数据,否则你的应用会宕机(当你获得一些流量并且数据库变得更大时)。
  • 考虑使用 ORM(如 NHibernate 或 EF),它将为您带来很多神奇的效果。

【讨论】:

    【解决方案2】:

    第一个 Web 方法必须是静态的,因为我们直接调用它们而不创建任何对象。 第二件事是我们不能直接在 web 方法中访问任何服务器端控件。

    这里可以获取客户端的数据源,并与客户端的中继器绑定。

    success: function (ret) {
    
                // here get the datasource as "ret".
                // bind the repeater with the data source manually.
         }
    

    然后将控件放在更新面板中,您不需要任何客户端数据,也不需要在 jQuery 中进行任何 ajax 调用。

    【讨论】:

    • 谢谢。知道我必须使用静态关键字。你能说我如何在客户端绑定数据源吗?以及如何传递数据源的对象?
    • 没有直接的方法。您必须在客户端手动执行此操作。例如,如果您需要在客户端绑定网格视图,我们知道网格视图呈现为表格,因此我们可以运行一个循环并为每一行做绑定工作。同样,对于转发器,您必须找到它在客户端的呈现方式(html 相当于转发器控件)。然后在客户端以列表或表格的形式获取数据源,并将相应的控件与相应的值绑定。
    • 很抱歉耽误您的时间,但您有此操作的代码吗?
    • 在不知道中继器内容和数据源的情况下,无法编写客户端绑定函数。如果您在这方面遇到问题,请直接使用更新面板,它会让您的生活变得轻松。
    • 在客户端绑定这些控件也不是一个好主意,因为您可能需要一些验证,或者可能希望在将它们显示在转发器中之前自定义数据源的数据。所以直接在你的按钮的点击事件处理程序中绑定转发器。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 2012-05-27
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多