2009-09-14 4 views
0

У меня есть пользовательский элемент управления, который использует стандартную парадигму if(!IsPostBack){//initialize myself}, чтобы избежать повторной инициализации во время postbacks (так что торговля меньшим количеством ударов БД для увеличения использования ViewState). Этот подход мне очень помогает, но есть одно место, где я хочу добавить этот элемент управления в иерархию управления «поздно» во время обратной передачи.Может ли Asp.Net UserControls знать, добавляются ли они «поздно» в иерархию управления?

Это, конечно же, приводит к сбою логики инициализации, а элемент управления должен отображаться в неинициализированном состоянии.

Какую охрану я должен использовать, чтобы определить, следует ли инициализировать, поскольку !IsPostBack не разрезает ее? Я могу установить флаг во время LoadViewState, но это кажется немного хакерским. То, что я хотел бы найти, - это некоторое условие, которое происходит только тогда, когда элемент управления сначала добавляется в иерархию элементов управления, а также ключ к этому. Существует ли такое условие?

[править] Пример псевдокод следует за содержащую страницу:

protected void Page_Prerender(object sender, EventArgs e) 
{ 
    Controls.Add(LoadControl("some_control.ascx")); 
} 

Есть ли способ для some_control знать, что это было добавлено поздно?

ответ

0

Дальнейшие поиски не привели меня к общему решению этой проблемы. То, что я закончил, это установить флаг в Page_LoadViewState, который подавил инициализацию элемента управления - фактически то же самое, что и защита инициализации с помощью !IsPostBack, но немного точнее.

0

Не можете ли вы использовать конструктор для инициализации своих дочерних элементов управления? (или создать метод Initialize). Затем вы управляете, когда инициализируется элемент управления.

0

Возможно, это поможет вам разобраться в вашей проблеме: «... что, если элемент управления создан в обработчике событий и динамически добавлен в дерево управления? В этом случае контроль играет догоняющую. Как только он будет добавлен к дереву управления, он начинает выполнять свои фазы, пока он не достигнет текущей фазы страницы ...»

Больше информации здесь:

http://weblogs.asp.net/vga/archive/2003/08/11/23498.aspx

+0

Эта статья в блоге фактически немного искажает ситуацию; контроль не играет догоняющего, он насильно улавливается - и то, что мне нужно, - это механизм, чтобы выяснить, когда я в этом состоянии. –

+0

Возможно, что-то подобное вам поможет: protected void Page_Prerender (отправитель объекта, EventArgs e) { MyControl control = LoadControl («MyControl») как MyControl; control.MustInitialize = true; Controls.Add (управление); } –

+0

Закончено решение этой проблемы почти таким образом, но без необходимости определять публичный MustInitialize. Благодаря! –

0

Существует не очень концепция добавления элемента управления для «первого» времени, потому что помните, что каждый раз, когда вы запрашиваете страницу, создается объект страницы , со всеми объектами управления . Ранее созданные экземпляры управления не добавляются в ваш новый объект страницы.

Почему логика инициализации терпит неудачу? Возможно, если бы вы разместили этот код, мы могли бы предложить что-то - похоже, что это обязательно должно быть так.

+0

Я знаю, что я получаю новый экземпляр всех элементов управления для каждой обратной передачи - то, что я пытаюсь понять, заключается в том, знает ли пользовательский контроль, что он был добавлен в иерархию управления вне последовательности (то есть через Controls.Add) во время какой-либо конкретной обратной передачи. –