【问题标题】:Selected event not raised for ObjectDatasource when enable-caching is true当启用缓存为真时,不会为 ObjectDatasource 引发选定事件
【发布时间】:2011-01-19 23:48:19
【问题描述】:

我有一个使用 ODS(ObjectDataSource) 来获取数据的 Gridview 控件。为了获得最佳性能和效率,我关闭了 Gridview 的视图状态(即 EnableViewstate = "false"。

我还在关联的 Objectdatasource 中启用了缓存。这消除了多达 50-60% 的性能优化,因为它消除了数据库往返.. 由 ODS 缓存提供。

因此,在此之后,我陷入了著名的“ODS 排序”问题,但我设法为它发明了一个棘手的解决方案并且它工作正常:

Optimize Pagination & Sorting with ObjectDataSource having EnableCaching = true

下一个分页,它也可以正常工作。现在,我需要在 Gridview 的顶部显示“总记录:X”。嗯,我部署了如下方法:

protected void ods_Selected(object sender, ObjectDataSourceStatusEventArgs e)
        {
            if(e.ReturnValue != null && e.ReturnValue.GetType() == typeof(int))
                base.setTotalLabel(lblTotal, e.ReturnValue);
        }

不要混淆 - base.setTotalLabel 是我自己用计数设置标签文本的方法。这也可以正常工作,但问题是 -

只要 ODS 从 它的缓存不会触发 ODS_Selecting 或 ODS_Select 事件。 它们只是“绕过”,因为它 从缓存中获取数据。这是当我 无法刷新总计记录 数一数!

我希望我已经很好地解释了我的问题,这很棘手。我已经准备好为此进行任何技巧或脏编码,因为我想维护 ODS 缓存,并且我不能仅仅因为一些偶然的“错误更新”而回滚更改。

请帮忙!

【问题讨论】:

    标签: caching count record objectdatasource


    【解决方案1】:

    我有完全相同同样的问题吗?

    我一直在做的一个解决方案是在 gridview 数据绑定方法中再次(通过 BLL)调用 select count 方法,并将其存储在 viewstate var 中,然后使用它来显示记录数。但这会导致两件事:

    • 对 DB 计数 sp 的另一个调用(破坏缓存目的)
    • 显示冲突,即显示的缓存记录数量可能与实际数量不匹配(这是最新的)

    【讨论】:

      【解决方案2】:

      这对我有用,我设置了 CacheKeyDependency 并在我想刷新时明确地将其设置为一个新值。如果我想显式刷新,我会在查询字符串中传递 &refresh=1。

      在 .aspx 中 -

      <asp:ObjectDataSource ID="odsOrg" runat="server" SelectMethod="SearchOrg" ... EnableCaching="true" CacheDuration="60" CacheKeyDependency="key1">
      

      在后面的代码中 -

      public const string argRefresh = "refresh=1";
      public void CheckExpiredCacheKey(string ckey)
      {
       if (Cache[ckey] == null) 
        Cache[ckey] = new object(); //Set Cache key which will b used to manually expire ODS cache     
      
      if (!IsPostBack && Request.QueryString["refresh"] == "1")//check refresh flag
       {
          //Cache.Remove(ckey);//NOT NEEDED: use the following instead
          Cache[ckey] = new object();// Needed otherwise it'll call Grid-populate twice
       } 
      }
      

      【讨论】:

        【解决方案3】:

        我通过在所选事件期间将记录计数存储在会话变量中解决了这个问题:

        protected void odsSearchResults_Selected(object sender, ObjectDataSourceStatusEventArgs e)
            {
                DataTable resultsTable = e.ReturnValue as DataTable;
                if (resultsTable == null)
                {
                    return;
                }
                Session["ResultCount"] = resultsTable.Rows.Count;
                lblRecordCount.Text = resultsTable.Rows.Count.ToString();
            }
        

        如果会话变量不为空,则在 Page_Load 中显示记录数:

        if(Session["ResultCount"] != null)
        {
            lblRecordCount.Text = Session["ResultCount"].ToString();
        }
        

        现在 lblRecordCount 将显示数据是否来自缓存的记录数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          • 1970-01-01
          • 2014-05-24
          • 2017-03-18
          相关资源
          最近更新 更多