Знакомство с 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 | |||
---|---|---|---|
Category | Message | From 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()), приведет к исключению. |