Могут ли Asp.Net UserControls знать, добавляются ли они «поздно» в иерархию элементов управления? - PullRequest
0 голосов
/ 14 сентября 2009

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

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

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 16 сентября 2009

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

0 голосов
/ 14 сентября 2009

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

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

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

0 голосов
/ 14 сентября 2009

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

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

0 голосов
/ 14 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...