2012-03-15 4 views
0

Я использую System.Web.UI.WebControls.Menu для создания и представления пользовательского меню. Загрузка меню требует значительных операций с базой данных и занимает около 1,4 секунды, поэтому я ищу способы кэширования меню в очереди страниц. Если я сохраняю SessionVariable [«ThisMenu»], который содержит элемент управления меню, значение ThisMenu корректно отображается на поворотах страницы; однако я не могу установить фактический контроль на странице успешно.Кэширование ASP.NET Управление меню

Если я пытаюсь этот код, он компилирует и выполняет, но ничего не появляется в выводе HTML:

System.Web.UI.WebControls.Menu ctlMasterMenu = (System.Web.UI.WebControls.Menu)GetControl("ctlMasterMenu"); 
if (ctlMasterMenu != null) 
{ 
    if (ThisMenu != null) 
    { 
     ctlMasterMenu = ThisMenu; 
    } 
    else 
    { 
     LoadPageMenu((System.Web.UI.WebControls.Menu)ctlMasterMenu); // Sets ThisMenu 
    } 
} 

If I try this code, it executes, but as it adds a MenuItem to ctlMasterMenu, it removes the item from ThisMenu. The result is that after a few page turns, the menu is empty. 

System.Web.UI.WebControls.Menu ctlMasterMenu = (System.Web.UI.WebControls.Menu)GetControl("ctlMasterMenu"); 
if (ctlMasterMenu != null) 
{ 
    if (ThisMenu != null) 
    { 
     List<MenuItem> items = new List<MenuItem>(); 
     for (int i = 0; i < ThisMenu.Items.Count; i++) 
     { 
      items.Add(ThisMenu.Items[i]); 
     } 
     ctlMasterMenu.Items.Clear(); 
     foreach (MenuItem item in items) 
     { 
      ctlMasterMenu.Items.Add(item); // Causes item to be removed from ThisMenu 
     } 
    } 
    else 
    { 
     LoadPageMenu((System.Web.UI.WebControls.Menu)ctlMasterMenu); 
    } 
} 

Там должен быть простой способ, который работает.

+0

Это .NET, а не классический ASP –

ответ

1

Рассмотрите вопрос о кешировании или переработке запроса на базу данных. Кэширование меню, скорее всего, приведет к хранению дополнительных данных на сервере или клиенте через ViewState. Источником ваших меню являются ваши данные, поэтому вы должны начать там.

+0

Я кэширую результаты запроса базы данных, но обработка этих результатов - это то, что занимает время. Я понимаю хит ViewState, и я тоже хочу этого избежать. Прямо сейчас я получаю худшее из обоих миров. Это элемент управления ASP, поэтому он завершается в ViewState И я перестраиваю его из кэшированного запроса. Хотелось бы, чтобы это продолжалось. –

+0

Боб, метод «LoadPageMenu» занимает 1,2 секунды? Было бы интересно увидеть этот код. – andleer

1

Храните фактические данные, которые строят меню в кеше, и каждый раз создавайте меню из этих кешированных данных. Отключите режим просмотра, чтобы сэкономить на производительности. Не храните меню или элементы меню самостоятельно.

+0

Это именно то, что я делаю сейчас, но для восстановления управления ... требуется почти 1,2 секунды ... отсюда этот пост. Я также хочу узнать, как кэшировать элемент управления. –

+0

@BobJones Это код выше? Почему тогда вы очищаете элементы из списка? Если вы отключите viewstate и добавьте элементы в каждый ответ, это должно быть быстрее. Если нет, другая альтернатива заключается в том, что вы можете связать ее с XML, как указано здесь: http://msdn.microsoft.com/en-us/library/ecs0x9w5(v=vs.80).aspx Итак, вы можете преобразовать его для XML в первый раз, затем onpostback, попробуйте преобразовать его. –

Смежные вопросы