Выбранное событие не вызывается для ObjectDatasource, когда enable-caching - true - PullRequest
0 голосов
/ 23 февраля 2010

У меня есть элемент управления Gridview, использующий ODS (ObjectDataSource) для извлечения данных. Для лучшей производительности и эффективности я отключил состояние просмотра Gridview (т.е. EnableViewstate = "false".

И я также включил кэширование в связанном источнике Objectdatasource. Это устраняет до 50-60% оптимизации производительности, поскольку устраняет необходимость в двустороннем обращении к БД. Предоставлено ODS Caching.

Итак, после этого я застрял в известной проблеме «сортировки ОРВ», но мне удалось изобрести хитрое решение для нее и она работает нормально:

Оптимизация разбивки на страницы и сортировки с ObjectDataSource, имеющим EnableCaching = true

Следующая нумерация страниц также работает нормально. Теперь мне нужно отобразить «Всего записей: X» в верхней части Gridview. Ну, я развернул следующий метод:

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_Selecting или ODS_Select. Они просто "обойдены", потому что это берет данные из кеша. Это когда я не удается обновить итоговые записи сосчитать!

Надеюсь, я хорошо объяснил свою проблему, это сложно. Я готов сделать любую хитрость или грязное кодирование для этого, потому что я хочу поддерживать ODS-кэширование и не могу откатить изменения только из-за нескольких случайных «неправильных обновлений».

Пожалуйста, помогите!

Ответы [ 3 ]

1 голос
/ 30 июня 2011

Это сработало для меня, я установил 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
 } 
}
0 голосов
/ 15 апреля 2015

Я решил эту проблему, сохранив количество записей в переменной сеанса во время выбранного события:

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 покажет количество записей, если данные поступают из кеша или нет

0 голосов
/ 14 января 2011

У меня точно такая же проблема?

Решение, которое я делал, это снова вызвать метод счетчика выбора (через BLL) в методе привязки данных gridview и сохранить его в var viewstate, а затем использовать его для отображения количества записей. Но это приводит к двум вещам:

  • еще один вызов к счетчику БД sp (игнорирует цель кэширования)
  • конфликт представления, то есть количество отображаемых кэшированных записей может не совпадать с фактическим числом (которое является актуальным)
...