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


 

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

Жизненный цикл страницы 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.pageBegin PreInit  
aspx.pageEnd PreInit0.03649733141678650.036497
aspx.pageBegin Init0.03790504593462910.001408
aspx.pageEnd Init0.0476937041434910.009789
aspx.pageBegin InitComplete0.04778645084682210.000093
aspx.pageEnd InitComplete0.04818756702706080.000401
aspx.pageBegin PreLoad0.04898797325167180.000800
aspx.pageEnd PreLoad0.04944622836072750.000458
aspx.pageBegin Load0.04949248921942380.000046
aspx.pageEnd Load0.05534418973814140.005852
aspx.pageBegin LoadComplete0.05547110430598090.000127
aspx.pageEnd LoadComplete0.0559421536153990.000471
aspx.pageBegin PreRender0.05614556340228740.000203
aspx.pageEnd PreRender0.06186048746953320.005715
aspx.pageBegin PreRenderComplete0.062698710080620.000838
aspx.pageEnd PreRenderComplete0.06332597462658580.000627
aspx.pageBegin SaveState0.0803605412161740.017035
aspx.pageEnd SaveState0.2137953777888880.133435
aspx.pageBegin SaveStateComplete0.2139112980438720.000116
aspx.pageEnd SaveStateComplete0.2143857633897880.000474
aspx.pageBegin Render0.2144400787450780.000054
aspx.pageEnd Render0.3150443372289230.100604


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

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

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

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

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

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

 
« Предыдущая статья   Следующая статья »