Есть ли событие загрузки после страницы в ASP.net
Есть ли событие, которое запускается после всех Page_Load
события завершились?
Как я могу иметь больше одного
Page_Load
?
Когда у вас есть пользовательские элементы управления.
Прежде чем моя страница сможет отрисоваться, мне нужно, чтобы моя страница (и все встроенные элементы управления) инициализировались, завершив свои события Page_Load
.
Проблема, конечно, в том, что если я помещаю код в обработчик моей страницы Page_Load
:
MyPage.aspx
--> Page_Load
---> DoSomethingWithUserControl()
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
Затем я начинаю получать доступ к своему управлению UserControl1
перед ним готова.
Мне нужен способ запуска кода после того, как Все Page_Load
события сработали, но до того, как какие-либо события обратной передачи (например, события щелчка) сработали:
MyPage.aspx
--> Page_Load
UserControl1.ascx
--> Page_Load
---> initialize ourselves now that viewstate has been restored
MyPage.aspx
--> Page_AfterLoad
---> DoSomethingWithUserControl()
Глядя на жизненный цикл страницы в MSDN, кажется, что нет никакого способа вызвать событие после того, как все Page_Loads были завершены:
Есть ли способ вызвать after после завершения всех загрузок страниц?
2 ответа:
Page_LoadComplete
является событием, которое возникает после загрузки всех элементов управленияПомните, что событие
Init
сначала запускается всеми дочерними элементами управления, и как только все элементы управления были инициализированы, возникает событиеInit
страницы. СобытиеLoad
работает наоборот, страница сначала вызывает событиеLoad
, а затем каждый дочерний элемент управления вызывает свое собственное событиеLoad
. В конце ставитсяLoadComplete
. Обратите внимание, что это верно только тогда, когда элементы управления создаются во время проектирования , когда элементы управления создаются динамически, они (к сожалению) не следуют этому подходу строго.Из MSDN:
Если элементы управления создаются динамически во время выполнения или декларативно в шаблонах элементов управления с привязкой к данным, их события изначально не синхронизируются с событиями других элементов управления на странице. Например, для элемента управления, добавляемого во время выполнения, события Init и Load могут происходить намного позже в жизни страницы цикл , чем те же события для элементов управления, созданных декларативно. Таким образом, с момента создания экземпляра динамически добавляемые элементы управления и элементы управления в шаблонах вызывают свои события одно за другим, пока они не догонят событие, во время которого оно было добавлено в коллекцию элементов управления.
Взгляните:
(Источник: http://msdn.microsoft.com/en-us/library/ms178472.aspx )
Правка 1
Для того, чтобы выполнить все ваши требования:
Мне нужен способ запуска кода после запуска всех событий Page_Load, но до запуска всех событий postback (например, Click events):
Я думаю, что самый простой способ-объявить пользовательское событие в пользовательском элементе управления и запустить его после загрузки элемента управления, а затем просто подписаться на это событие в вашем ASPX
Пользовательский Контроль
public event Action LoadCompleted = delegate { }; protected void Page_Load(object sender, EventArgs e) { this.LoadCompleted(); }
Страница ASPX
protected void Page_Load(object sender, EventArgs e) { this.myUserControl.LoadCompleted += () => { // do somethign interesting this.lblMessage.Text = DateTime.Now.ToString(); }; }
Похоже, что на самом деле нет способа надежно заставить ваш код выполняться между временем, когда все (статически объявленные, см. комментарий Jupaols о динамически добавляемых) элементах управления загружаются, и временем, когда их события обратной передачи вызываются.
Я даже пошел так далеко, чтобы разобрать класс Page с помощью reflector, и насколько я могу судить, страница не вызывает никаких методов, которые вы могли бы использовать между этими временами.
Так что в общем случае кажется, что ваш только что из удача.
Но ваше утверждение
Затем я начинаю обращаться к своему элементу управления UserControl1, прежде чем он будет готов
Сомнительно. К моменту вызова метода
Page_Load
для всех элементов управления (по крайней мере, для статически объявленных) были установлены состояния viewstate и control. Поэтому, если у вас нет еще какой-то инициализации состояния в методе OnLoad элемента управления, элемент управления готов к работе. Если у вас действительно что-то происходит в OnLoad, то почему бы и нет тамошняя возня?