проф. В.К.Толстых, Технологии разработки Internet- приложений ASP.NET приложения – класс Page, внутренние объекты, хранение состояний, основные свойства, жизненный цикл страницы Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета
Базовый класс Page В.NET Framework класс Page реализует базовое поведение всех объектов приложения ASP.NET в файлах.aspx. Разработчики приложения на его основе развивают потомка Page с дополнительными компонентами, методами… Его потомки, обычно, размещаются в отдельном файле.cs в виде класса, например, _Default : public partial class _Default : System.Web.UI.Page { … } Среда ASP.NET из этого потомка создаёт экземпляр, который генерирует HTML-разметку, вставляемую в ответ браузеру (см. Компиляция проекта).Компиляция проекта Класс Page определён в пространстве имён System.Web.UI : Public class Page: TamplateControl, IHttpHandler TamplateControl – абстрактный класс для страниц и пользовательских элементов, потомок класса Control, IHttpHandler – интерфейс для обработки событий, связанных с запросом HTTP. Класс Page имеет большое количество свойств, которые условно разделяют на рабочие свойства, контекстные свойства и внутренние объекты, а также обладает событиями и методами, связанными с рендеренгом (генерация HTML-разметки страницы), с элементами управления и со сценариями.
Внутренние объекты класса Page СвойствоОписание Application* Представляет состояние приложения Cache Кэш приложения Request* Запрос HTTP Response* Ответ (HTML) Server* Вспомогательные методы для обработки Web-запроса Session* Управление сеансом с пользователем Trace Осуществляет трассировку выполнения страницы User Объект, представляющий пользователя от которого поступил запрос * - организуют хранение состояний
Хранение состояний 1.Куки – реализуются объектами Request и Response. Недостатки: файлы куки могут не сохраняться на машине пользователя, пользователь может их редактировать. Достоинства: файл куки привязан к конкретному пользователю компьютера. На хранение состояний в файле куки не требуются ресурсы сервера. 2.Скрытые поля – реализуются как обычный элемент управления со свойством Visible="False", например,. Недостатки: пользователь может читать и изменять данные, сохраненные в этом поле. 3.ViewState (свойство Page) – сохраняется как скрытое поле _VIEWSTATE, и передается клиенту в HTML- коде страницы. Используется следующим образом: ViewState["color"] = "red"; // - запись string strColor =(string)ViewState["color"]; // - чтение Достоинства: всегда передаётся клиенту в отличие от куки. Привязано к конкретной странице приложения. Значение закодировано в BASE64 и поэтому его прочитать непросто. Может быть и зашифровано. 4.Session – свойство страницы, реализуется объектом Session. Сессия создаётся когда пользователь впервые обращается к какой-либо странице Web-приложения. Позволяет хранить переменные пользователя при его навигации по страницам приложения. Используется следующим образом: Session["so"] = SomeObject; // - сохранение объекта SomeObject =(SomeObject Type)Session["so"]; // - получение объекта SomeObject =(SomeObject Type)Session["so"]; // - получение объекта Например, если объект – строка, то if ( Session["so"] != null ) { Text = Session["so"].ToString(); } Достоинства: данные хранятся на сервере и полностью скрыты от пользователя. Недостатки: требуются ресурсы сервера. 5.Application – свойство страницы, реализуется объектом Application. Создаётся при первом запуске Web-приложения. Позволяет хранить глобальные переменные приложения доступные для всех сессий. Используется аналогично Session
Некоторые свойства класса Page СвойствоОписание ClientQueryString Возвращает строку GET-запроса из URL. Controls Возвращает коллекцию дочерних элементов управления текущей страницы. EnableViewState Указывает должна ли страница управлять данными состояния представ- ления EnableViewStateMac Добавлять ли к состоянию представления страницы зашифрованную аутентифика- ционную подпись на основе кода машины (см. ) для зашиты от ErrorPage Возвращает или задаёт URL страницы, куда в случае необработанного исключения будет перенаправлен браузер Form Возвращает объект – текущую форму. Header Возвращает объект – заголовок страницы. IsAsync Определяет способ выполнения страницы IsCallback Позволяет определить, загружена ли страница в результате обратного вызова (клиентский JavaScript – Callback, при этом ViewState страницы не меняется, страница обновляется не полностью). IsCrossPagePosBack Позволяет определить, загружена ли страница в результате возврата формы от другой страницы. IsPostBack Указывает, загружена ли страница в ответ на возврат формы клиентом, или это её первая загрузка. IsValid Указывает, успешно ли прошла валидация страницы. Master Возвращает объект –эталонная страница (MasterPge) текущей страницы MasterPageFile Возвращает, задаёт файл MasterPge.
.. продолжение СвойствоОписание PreviousPage Возвращает объект – предыдущую страницу, участвующую в процессе возврата формы к текущей странице. StyleSheetTheme Возвращает или задаёт имя таблицы стилей для текущей страницы. Theme Возвращает или задаёт имя темы страницы (таблицы стилей, рисунки, скины – множество значений атрибутов оформления элементов типа label, button …). Реализуется в обработчике Page_PreInit. Title Получает или задает строку-заголовок страницы. TemplateSourceDirectory Возвращает имя виртуального каталога текущей страницы. ViewState Состояние представления страницы. ViewStateEncriptionMode Указывает должно ли быть зашифровано состояние представления страницы (см. Шифрование задаётся методом ViewStateUserKey Строковое свойство (обычно – имя пользователя) для хэширования данных состояния представления с целью защиты от атак one-click (использование корректного состояния представления страницы в поддельных страницах). Реализуется в обработчике Page_Init. Таким образом, состояния представления страницы м. б. зашифровано (ViewStateEncriptionMode) для хранения конфиденциальной информации, м.б. с цифровой подписью для зашиты от изменений (EnableViewStateMac) и м.б. хэшировано (ViewStateUserKey) против несанкционированного использования в других страницах.
Основные события жизненного цикла страницы Добавим атрибут Trace="true" к директиве Page и мы увидим множество событий. При создании страницы самое популярное событие Load оформляется как метод Page_Load. Разработчику страницы доступны и еще четыре события: PreInit, Init, PreRender, Unload. Для каждого из них в класс может быть включен метод его обработки.
События класса Page и их порядок в жизненном цикле страницы СобытиеОписание PreInt Возникает перед началом инициализации страницы. Свойства IsCallback, IsCrossPagePostback, IsPostback уже доступны. Инициализируется тема страницы, эталонная страница (MasterPage) связывается с текущей страницей, создаются динамические элементы управления. Init Инициализируется страница и её компоненты – задаётся начальное ViewState страницы. Метод ProcessRequest перебирает в цикле все дочерние элементы (каждый из них может использовать метод onInt ) страницы. Сама страница инициализируется последней. InitComplete Уведомление о завершение инициализации всей страницы. Все элементы управления получили состояние, запрограммированное в коллекции ViewState, до связи с клиентом. Если IsPostBack=true, то состояние элементов управления корректируются на основе скрытых полей _VIEWSTATE, полученных от клиентской страницы, обрабатываются клиентские данные. PreLoad Страница завершила инициализацию системного уровня. Здесь пользовательский код страницы имеет возможность сконфигурировать её для дальнейшего выполнения. Load Начало загрузки страницы для выполнения и дальнейшего рендеринга (для генерации HTML- ответа). Возникает для свей страницы и рекурсивно для всех её элементов. Здесь сформированы и доступны все свойства всех элементов управления с учётом данных, полученных от клиента. Обычно здесь, в методе Page_Load(), разработчик анализирует данные клиента и уточняет (формирует) страницу ответа. После выполнения данного метода разработчик может реализовать свои алгоритмы в методах, связанных с событиями на клиентской стороне (например, щелчок мыши на кнопке – Button1_Click() ), которые привели к возврату формы.
СобытиеОписание LoadCompete Уведомление о завершение этапа подготовки страницы к рендерингу. PreRender Возникает для свей страницы и рекурсивно для всех её элементов. Страница и её дочерние элементы управления могут выполнить последние изменения до начала рендеринга всей страницы. PreRenderCopmlete Уведомление о завершении PreRender для всей страницы. SaveStateComplete Сохранение текущего состояния страницы – создание данных для скрытых полей _VIEWSTATE. Далее наступает рендеринг – вызывается метод Render для каждого элемента управления, который генерирует собственную HTML-разметку, выводя её в буфер, где накапливается код клиентской страницы. Unload Завершение рендеринга. Возникает для каждого элемента управления, а потом для всей страницы. Здесь можно закрывать файлы, пользовательские сеансы, отключать БД… Dispose Возникает перед удаление страницы, последняя возможность освободить ресурсы, связанные со страницей, далее она будет удалена. Продолжение…