Класс Page

advertisement
Из цикла лекций «Технологии разработки 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
Возникает перед удаление страницы, последняя возможность освободить ресурсы,
связанные со страницей, далее она будет удалена.
Download