Из цикла лекций «Технологии разработки Internet-приложений» для студентов 4-го курса кафедры Компьютерных технологий физического факультета Донецкого национального университета Технологии разработки Internetприложений ASP.NET приложения – класс Page, внутренние объекты, хранение состояний, основные свойства, жизненный цикл страницы проф. В.К.Толстых, www.tolstykh.com Базовый класс Page В .NET Framework класс Page реализует базовое поведение всех объектов приложения ASP.NET на каждой странице, т.е. – во всех файлах .aspx. Разработчики приложения на основе класса Page на своих страницах развивают его потомков с дополнительными компонентами, свойствами, методами. Потомки Page , обычно, размещаются в отдельном файле .cs, присоединённом к .aspx, в виде класса, например, _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", например, <asp:TextBox ID="txtState" Visible="False" Runat="server" / >. Недостатки: пользователь может читать и изменять данные, сохраненные в этом поле. 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"]; // - получение объекта Например, если объект – строка, то if ( Session["so"] != null ) { Text = Session["so"].ToString(); } Достоинства: данные хранятся на сервере и полностью скрыты от пользователя. Недостатки: требуются ресурсы сервера. 5. Application – свойство страницы, реализуется объектом Application. Создаётся при первом запуске Web-приложения. Позволяет хранить глобальные переменные приложения доступные для всех сессий. Используется аналогично Session. Некоторые свойства класса Page Свойство Описание ClientQueryString Возвращает строку GET-запроса из URL. Controls Возвращает коллекцию дочерних элементов управления текущей страницы. EnableViewState Указывает должна ли страница создавать, хранить, передавать данные состояния представления (см. директивы @Page). EnableViewStateMac Добавлять ли к состоянию представления страницы зашифрованную аутентификационную подпись на основе кода машины (см. директивы @Page) для зашиты от изменений. ErrorPage Возвращает или задаёт URL страницы, куда в случае необработанного исключения будет перенаправлен браузер (см. директивы @Page). Form Возвращает объект – текущую форму. Header Возвращает объект – заголовок страницы. IsAsync Определяет способ выполнения страницы (см. директивы @Page). IsCallback Позволяет определить, загружена ли страница в результате обратного вызова (клиентский JavaScript Callback – передача исполняемого кода в качестве одного из параметров другого кода). В этом случае ViewState страницы не меняется, страница обновляется не полностью. IsCrossPagePosBack При межстраничном постинге позволяет определить, загружена ли страница через атрибут PostBackUrl или с помощью метода Server.Transfer. IsPostBack Указывает, загружена ли страница в ответ на возврат формы клиентом, или это её первая загрузка. IsValid Указывает, успешно ли прошла валидация страницы. Master Возвращает объект – эталонная страница (MasterPge) текущей страницы MasterPageFile Возвращает, задаёт файл MasterPge. .. продолжение Свойство Описание PreviousPage Возвращает объект – предыдущую страницу, участвующую в процессе возврата формы к текущей странице. StyleSheetTheme Возвращает или задаёт имя таблицы стилей для текущей страницы. Theme Возвращает или задаёт имя темы страницы (таблицы стилей, рисунки, скины – множество значений атрибутов оформления элементов типа label, button…) . Реализуется в обработчике Page_PreInit. Title Получает или задает строку-заголовок страницы. TemplateSourceDirectory Возвращает имя виртуального каталога текущей страницы. ViewState Состояние представления страницы. ViewStateEncriptionMode Указывает должно ли быть зашифровано состояние представления страницы (см. директивы @Page). Шифрование задаётся методом Page.RegisterRequiresViewStateEncryption(); ViewStateUserKey Устанавливает хеширование состояния представления страницы с целью защиты от атак one-click (использование корректного состояния представления страницы в поддельных страницах). Реализуется в обработчике Page_Init. Пример: Page.ViewStateUserKey = user; – строковое значение, обычно – имя пользователя. Таким образом, состояния представления страницы м. б. зашифровано (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 Возникает перед удаление страницы, последняя возможность освободить ресурсы, связанные со страницей, далее она будет удалена.