Страница 5 из 11 Жизненный цикл страницыЖизненный цикл страницы 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()), приведет к исключению. |
|