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

enter image description here

есть ли способ поднять после после все Page_Loads завершены?

2 ответов


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

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

из MSDN:

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

смотрим:

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

enter image description here

изменить 1

для того, чтобы выполнить все ваши требования:

мне нужен способ запуска кода после запуска всех событий Page_Load, но до запуска любых событий обратной передачи (например, событий щелчка):

Я думаю, что самый простой способ-объявить пользовательское событие в пользовательском элементе управления и запустить его после загрузки элемента управления, а затем jus подпишитесь на это событие в своем 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 о динамически добавленных) элементах управления загружаются и временем, когда их события обратной передачи вызываются.

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

поэтому для общего случая это выглядит так тебе просто не повезло.

но ваше утверждение

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

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