RegisterRequiresControlState задолбал! Помогите кто-нибудь!
От: Gli4  
Дата: 08.01.08 17:37
Оценка:
Всем привет!
Помогите кто может!
В общем вот в чем дело:

В одном проэкте находится паблин класс Menu.cs.
У него существует метод CreateMenu(), кот возвращает экземпляр класса System.Web.UI.WebControls.Menu.
В процессе выполнения этого метода строится структура меню.

Существует сайт. На нем вызывается метод CreateMenu() при событии Application_Start:

public static System.Web.UI.WebControls.Menu menu = null;

protected void Application_Start(Object sender, EventArgs e)
{
  menu = namespace.Menu.CreateMenu();
}


Далее на сайте существует WebUserControl MenuControl, который берет menu из global.asax.cs и помещает его на панель, кот находится на разметке контрола.

Получается, что при старте сайта генерится меню и помещается в гловальную переменную, откуда в последствии берется постоянно.

Проблема в том, что первый раз все загружается как надо, но при поледующей загрузке страницы выпадает вот что:

RegisterRequiresControlState can only be called before and during PreRender.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: RegisterRequiresControlState can only be called before and during PreRender.

Помогите разобраться кто может.
Заранее спасибо.
Re: RegisterRequiresControlState задолбал! Помогите кто-нибу
От: mogadanez Чехия  
Дата: 09.01.08 16:34
Оценка: +1
Здравствуйте, Gli4, Вы писали:

G>Всем привет!

G>Помогите кто может!
G>В общем вот в чем дело:

G>В одном проэкте находится паблин класс Menu.cs.

G>У него существует метод CreateMenu(), кот возвращает экземпляр класса System.Web.UI.WebControls.Menu.
G>В процессе выполнения этого метода строится структура меню.

G>Получается, что при старте сайта генерится меню и помещается в гловальную переменную, откуда в последствии берется постоянно.

<skip>

ужас, зачем такие извращения? вы думаете чтото реально выиграете по скорости зачсет этого? а вы подумали что будет при _одновременном_ обращении к нему из разных страниц?( подсказка — у контрола есть свойство Page )


G>Проблема в том, что первый раз все загружается как надо, но при поледующей загрузке страницы выпадает вот что:


G>RegisterRequiresControlState can only be called before and during PreRender.


дело в том что у любого экземпляра класса Control( коим является и ваш System.Web.UI.WebControls.Menu ) есть внутреннее состояние. после первого использования этого экземпляра как минимум ControlState выставляется в PreRendered

ну а в том самом методе RegisterRequiresControlState есть проверка.

public void RegisterRequiresControlState(Control control)
{
    ...  
    if (control.ControlState == ControlState.PreRendered)
    {
        throw new InvalidOperationException(SR.GetString("Page_MustCallBeforeAndDuringPreRender", new object[] { "RegisterRequiresControlState" }));
    }
    ...


в общем если быть кратким — НЕМОЖНО переиспользовать экземпляры вебконтролов.

если у вас сложная структура меню — кэшируйте ее в виде метаинформации,
и просто накладывайте на контролку создаваемую каждый раз.
Re[2]: RegisterRequiresControlState задолбал! Помогите кто-н
От: Gli4  
Дата: 10.01.08 12:28
Оценка:
Такое вот извращение я думал использовать для того, чтобы избежать лишних запросов к базе.
Просто меню генерится согласно данным в базе.

Попробую использовать кеширование. Спасибо за совет.
Если вам не трудно не могли бы вы накидать примерно как это делается.
Заранее спасибо.
Re[3]: RegisterRequiresControlState задолбал! Помогите кто-н
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.01.08 03:02
Оценка:
Здравствуйте, Gli4, Вы писали:
G>Попробую использовать кеширование. Спасибо за совет.
G>Если вам не трудно не могли бы вы накидать примерно как это делается.
вот тебе пример:
1. Открываешь MSDN
2. Ищешь по словам SiteMapProvider
3. Реализуешь свой SiteMapProvider на основе одного из образцов. Он может лазить в базу, складывать результаты в кэш и т.п. Про кэш читать там же, по словам System.Web.Cache.
Страницам твоего приложения знать об этом не только не нужно, но и вредно. Это не их собачье дело, откуда берется навигация.
G>Заранее спасибо.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.