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

Что вызывает Page_Load и как он это делает?

Page_Load не является виртуальным методом. Что вызывает этот метод и как он это делает? Это отражение или какая-то другая техника? Также, сколько событий обрабатывается таким образом?

Также предпочтительнее обрабатывать вещи в перегруженном OnLoad или Page_Load? Как они отличаются?

4b9b3361

Ответ 1

У ASP.NET есть функция, называемая "AutoEventWireup" - эта функция позволяет создавать методы с подписями EventHandler с именами типа Page_Load, а среда выполнения связывает событие с родительской страницы с методом твой класс. В основном это выполняется от вашего имени:

this.Load += this.Page_Load;

Теперь лучше отключить AutoEventWireup и либо самостоятельно создать эти обработчики событий в методе OnInit страниц, либо просто переопределить метод родительской страницы OnLoad.

Изменить (в ответ на комментарий OP ниже): Этот процесс не охватывает нажатия кнопок и т.п., но процесс аналогичен.

Для того, чтобы метод типа MyButton_Click работал без явного создания обработчика событий, вам нужно установить атрибут OnClick в элементе управления в файле aspx следующим образом:

<asp:button 
    id="MyButton"
    onClick="MyButton_Click"
    runat="server" />

Это заставит ASP.NET создать делегат с щелчком кнопки для вас и прикрепить его к событию Click.

Ответ 2

Порядок, в котором вызываются виртуальные методы (OnLoad) и обработчики событий (Page_Load), определяется так называемым жизненным циклом страницы. Это как раз то, как среда выполнения ASP.NET обрабатывает входящий запрос (например, с этапами Init, Load, Render).

Вы можете использовать либо OnLoad, либо Page_Load, но вы должны знать, что происходит:

  • внутри OnLoad вы должны вызвать base.OnLoad
  • внутри base.OnLoad событие загрузки будет поднято
  • Page_Load - это обработчик события Load (который автоматически подключается к сети) и поэтому будет вызван в результате поднятого события Load.

Если вы не вызываете base.OnLoad в своем переопределении OnLoad, событие Load не будет поднято.


Обновление: вы можете использовать пустую страницу со следующим кодом, чтобы посмотреть, что произойдет:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    base.Load += new EventHandler(My_Page_Load);
}

void My_Page_Load(object sender, EventArgs e)
{
    Response.Write("My_Page_Load<br/>");
}

protected override void OnLoad(EventArgs e)
{
    Response.Write("Start of OnLoad<br/>");
    base.OnLoad(e);
    Response.Write("End of OnLoad<br/>");
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Page_Load<br/>");
}

Попробуйте прокомментировать вызов base.OnLoad(e) и снова просмотрите.

Ответ 3

Метод OnLoad где-то вверх по иерархии страниц вызывает события, назначенные Load (через + =).

Именование Page_Load - это просто соглашение. В режиме AutoEventWireUp (т.е. Явно не объявлен обработчик событий) это соглашение используется для поиска обработчиков событий по их именам.

Если у вас есть .Net1, вы можете увидеть, как дизайнер добавляет код на страницу OnInit(), чтобы добавить все компоненты страницы и установить

this.Load += new System.EventHandler(this.Page_Load);

.Net2 все еще делает это, но в отдельном файле, который скрыт где-то под файлами Windows\Microsoft.Net\Framework\v *\Temporary ASP.Net.

Я нахожу этот график в жизненном цикле страницы ASP.Net очень полезен.

Ответ 4

Взгляните на жизненный цикл страницы ASP.NET, есть раздел для событий жизненного цикла, где он описывает загрузку.

Load
Страница вызывает событие OnLoad метод на странице, затем рекурсивно делает то же самое для каждого дочернего элемента управления, который делает то же самое для каждого из своих дочерние элементы управления до тех пор, пока страница и все элементы управления загружены. Использовать OnLoad метод события для установки свойств в контроля и создания базы данных соединения.

Дополнительная цитата:

Обратите внимание, что при создании события обработчик, используя синтаксис Page_event, базовая реализация неявно и поэтому вам не нужно для вызова этого метода. Для Например, класс базовой страницы OnLoad метод всегда называется, независимо от того, создайте метод Page_Load или нет. Однако, если вы переопределите страницу Метод OnLoad с переопределением ключевое слово (переопределяет в Visual Basic), вы должны явно называть базу метод. Например, если вы переопределите метод OnLoad на странице, вы должен вызвать base.Load(MyBase.Load в Visual Basic) для базы выполнение.

Ответ 5

В директиве страницы говорится: Autoeventwireup = "true"

То, что происходит, автоматически подключается к событию Load... (и некоторые другие события, такие как PreInit, Init, Unload и т.д.)