Подтвердить что ты не робот

Есть ли событие после страницы Page_Load в 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 были запущены, но до того, как были запущены события postback (например, события Click):

MyPage.aspx
   --> Page_Load
UserControl1.ascx
   --> Page_Load
          ---> initialize ourselves now that viewstate has been restored
MyPage.aspx
   --> Page_AfterLoad
          ---> DoSomethingWithUserControl()

Глядя на жизненный цикл страницы в MSDN, похоже, что невозможно завершить событие после завершения всех Page_Loads:

enter image description here

Есть ли способ повысить после того, как все страницы Page_Loads завершены?

4b9b3361

Ответ 1

Page_LoadComplete - это событие, которое возникает после загрузки всех элементов управления

Помните, что событие Init сначала запускается всеми дочерними элементами управления, и только когда все элементы управления были инициализированы, событие Init страницы поднято. Событие Load работает наоборот, страница сначала вызывает событие Load, а затем каждый дочерний элемент управления вызывает свое собственное событие Load. В конце появляется LoadComplete. Обратите внимание, что это верно только тогда, когда элементы управления создаются во время разработки, когда элементы управления создаются динамически, они (к сожалению) не строго придерживаются этого подхода.

Из MSDN:

Если элементы управления создаются динамически во время выполнения или декларативно в шаблонах элементов управления, привязанных к данным, их события изначально не синхронизируются с элементами других элементов управления на странице. Например, для элемента управления, который добавляется во время выполнения, события Init и Load могут происходить намного позже в жизненном цикле страницы, чем те же события для элементов управления, созданных декларативно. Поэтому с момента их создания динамически добавленные элементы управления и элементы управления в шаблонах поднимают свои события один за другим до тех пор, пока они не поймают событие, в течение которого оно было добавлено в коллекцию Controls.

Посмотрите:

(источник: http://msdn.microsoft.com/en-us/library/ms178472.aspx)

enter image description here

Изменить 1

Чтобы выполнить все ваши требования:

Мне нужен способ запуска кода после того, как все события Page_Load запущены, но до того, как были запущены события postback (например, события Click):

Я думаю, что самый простой способ - объявить пользовательское событие в User Control и запустить его после загрузки элемента управления, а затем подписаться на это событие в 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();
        };
    }

Ответ 2

Похоже, что на самом деле нет способа надежно заставить ваш код выполнять между тем временем, когда все (статически объявленные, см. комментарии Jupaols о динамически добавленных) элементах управления загружаются и время, когда возникают их события обратной передачи.

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

Итак, для общего случая вам кажется, что вам просто не повезло.

Но ваше выражение

то я начну доступ к элементу управления UserControl1, прежде чем он будет готов

сомнительно. К моменту вызова метода Page_Load на всех элементах управления (по крайней мере, статически объявленных) задано состояние представления и состояния управления. Поэтому, если в методе OnLoad элемента управления не выполняется еще одна инициализация состояния, элемент управления готов к обработке. Если у вас что-то происходит в OnLoad, то почему бы не заняться там?