Знакомство с ASP.NET 2.0 - Жизненный цикл страницы

ОГЛАВЛЕНИЕ

Жизненный цикл страницы

Жизненный цикл страницы ASP.NET начинается с получения и обработки Web-сервером IIS запроса к данной странице и передачи этого запроса среде выполнения ASP.NET. В момент получения запроса, среда выполнения загружает класс вызываемой страницы, устанавливает свойства класса страницы, выстраивает дерево элементов, заполняет свойства Requestи Response и вызывает метод IHttpHandler.ProcessRequest.После этого среда выполнения проверяет каким образом была вызвана эта страницы и если страница вызвана путем передачи данных с другой страницы, о чем будет рассказано далее, то среда выполнения устанавливает свойство PreviousPage.

Стоит отметить также, что помимо рассмотренных ниже этапов выполнения страницы существуют еще и этапы уровня приложения, не специфичные для страницы. Подробно об этапах выполнения приложения написано вэтой статье.

ЭтапОписание
Запрос станицы Запрос страницы осуществляетс ядо начала жизненноцо цикла страницы. Когда пользователь осуществляет запрос, среда выполнения ASP.NET устанавливает, необходимо ли осуществить компиляцию страницы и начать жизненный цикл, либо можно выдать в качестве ответа страницу из кеша, таким образом не выполняя страницы.
Начало жизненного цикла На этом этапе происходит установка свойство Response и Request и свойства UICulture. Также, на этом этапе устанавливается, была ли эта страница запрошена в результате постбэка (отправления данных на сервер) и соответствующим образом устанавливается свойсто IsPostBack.
Инициализация страницы Ко времени инициализации страницы все дочерние пользовательские элементы управления уже созданы и имеют установленный свойства UniqueID. В это же время к странице применяются темы оформления. Если страница вызвна в результате постбэка, то данные, отправленные на сервер, еще не загружены в свойства элементов управления, на этом этапе.
Загрузка Если страница вызвана в результате постбэка, то на этом этапе устанавливаются свойства элементов управления, на основании информации о состоянии (ViewState и ControlState).
Валидация Вызывается метод Validate() для всех, находящихся на странице валидаторов.
Обработка постбэка Вызываются обработчики событий (при условии, что постбэк произошел).
Рендеринг Сохраняется информация о состоянии, затем класс страницы вызывает соответствующие методы дочерних элементов управления для генерации HTML представления и передачи его в Response.OutputStream.
Выгрузка Выгрузка происходит после того, как создано HTML представление для всей страницы.

Во время прохождения этапов жизненного цикла возникают события, подписавшись на которые, разработчик может выполнять свой собственный код. Стоит упомянуть атрибут AutoEventWireup, директивы @Page: если этот атрибут установлен в true (значение по умолчанию), то методы класса страницы, названные Page_НазваниеСобытия, автоматически становятся обработчиками соответствующих событий жизненного цикла станицы.

Для того, чтобы проследить жизненный цикл страницы и последовательность возникновения событий, можно установить атрибут Trace директивы @Page в true, а атрибутTraceMode в "SortByTime". Тогда в разделе Trace Information можно найти список произошедших событий (колонка Message). Например:

Trace Information

CategoryMessageFrom First(s)From Last(s)
aspx.page Begin PreInit    
aspx.page End PreInit 0.0364973314167865 0.036497
aspx.page Begin Init 0.0379050459346291 0.001408
aspx.page End Init 0.047693704143491 0.009789
aspx.page Begin InitComplete 0.0477864508468221 0.000093
aspx.page End InitComplete 0.0481875670270608 0.000401
aspx.page Begin PreLoad 0.0489879732516718 0.000800
aspx.page End PreLoad 0.0494462283607275 0.000458
aspx.page Begin Load 0.0494924892194238 0.000046
aspx.page End Load 0.0553441897381414 0.005852
aspx.page Begin LoadComplete 0.0554711043059809 0.000127
aspx.page End LoadComplete 0.055942153615399 0.000471
aspx.page Begin PreRender 0.0561455634022874 0.000203
aspx.page End PreRender 0.0618604874695332 0.005715
aspx.page Begin PreRenderComplete 0.06269871008062 0.000838
aspx.page End PreRenderComplete 0.0633259746265858 0.000627
aspx.page Begin SaveState 0.080360541216174 0.017035
aspx.page End SaveState 0.213795377788888 0.133435
aspx.page Begin SaveStateComplete 0.213911298043872 0.000116
aspx.page End SaveStateComplete 0.214385763389788 0.000474
aspx.page Begin Render 0.214440078745078 0.000054
aspx.page End Render 0.315044337228923 0.100604

Из всех событий жизненного цикла страницы, разработчик может подписаться только на пять, помимо событий дочерних элементов управления. Эти события: PreInit, Init, Load, PreRender, Unload. Рассмотрим варианты использования этих событий.

СобытиеИспользование
PreInit

Во время этого события можно использовать свойство IsPostBack, для того, чтобы определить вызвана ли эта страница в первый раз или в результате постбэка. В плане управления страницей разработчик может: создавать динамически элементы управления, динамически устанавливать шаблон дизайна или тему оформления, считывать или устанавливать свойства объекта Profile.

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

Init На этом этапе разработчик может считывать или инициализировать свойства элементов управления.
Load На этом этапе разработчик может считывать или изменять свойства элементов управления.
PreRender Последняя возможность внести изменения во внешний вид страницы.
Unload Освобождение занятых ресурсов (закрытие открытых соединений с базой данных, завершение работы с файлами и т.п.)

Важно, что на этом этапе уже создано HTML представление страницы и попытка внести какие-либо изменения (например, вызвав метод Response.Write()), приведет к исключению.