Есть ли событие загрузки после страницы в 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 35

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, то почему бы и нет тамошняя возня?