Создание серверных элементов управления во время выполнения с помощью модулей HTTP - Обзор модулей HTTP
ОГЛАВЛЕНИЕ
Обзор модулей HTTP
ASP.NET обрабатывает каждый запрос в конвейере. HTTPModule и HTTPHandler – два пункта обработки этого конвейера. Каждый сделанный запрос проходит через несколько модулей HTTP и в конце назначается обработчику HTTP, решающему, как система поступит/отреагирует согласно запросу. После обработки запроса обработчиком запроса ответ возвращается приложению через модули HTTP. Модули HTTP выполняются до и после выполнения обработчика и предоставляют метод для взаимодействия с запросом.
Обязательные требования
• Каркас .NET 3.0
Создание пользовательского модуля HTTP
Создать модуль HTTP так же просто, как и создать обычный класс .NET, с той лишь разницей, что класс должен реализовывать интерфейс IHttpModule пространства имен System.Web. Интерфейс имеет два следующих метода:
• void Init(HttpApplication);
• void Dispose();
Шаг 1: Создать новый веб-сайт ASP.NET и выбрать язык C#.
Шаг 2: Щелкнуть правой кнопкой мыши по проекту и выбрать класс из диалогового окна. Добавить новый элемент.
Шаг 3: Убедиться, что созданный класс наследует интерфейс IHttpModule и реализует указанные выше методы.
Регистрация модулей HTTP
После выполнения вышеназванных шагов надо зарегистрировать пользовательский обработчик в файле web.config. Откроем файл web.config и найдем раздел httpmodules. Затем используем следующий синтаксис:
<httpmodules /><add name="[ModuleName]" type="[Assembly]" /></httpmodules />
Динамическая генерация и доступ к элементам управления с помощью модулей HTTP
В этом приложении было создано два текстовых поля, а именно: имя и возраст, и выпадающий список стран. Функция кнопки «Отправить» – выполнить клиентскую проверку только поля Age (является ли оно больше 50), и если страница правильная, то она получит доступ к значениям.
Шаг 1: Класс DynamicControls.cs наследует от System.Web.UI.Page, IHttpModule и реализует методы IHttpModule, описанные ранее.
Шаг 2: В методе Init вызывается событие PreRequestHandlerExecute класса HttpApplication:
//Реализация метода init
public new void Init(HttpApplication context)
{
context.PreRequestHandlerExecute +=
new EventHandler(context_PreRequestHandlerExecute);
}
Его же метод-обработчик отвечает за проверку правильной страницы и в случае обнаружения создает элементы управления в методе Init() и заполняет выпадающий список стран в событии Load().
//Вызывается PreRequestHandlerExecute
//Назначение: Если найдена правильная страница, то вызываются различные события страницы
// для выполнения операций
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
//Получает текущий контекст http
System.Web.HttpContext _httpContext = System.Web.HttpContext.Current;
if (_httpContext != null)
{
_page = _httpContext.Handler as System.Web.UI.Page;
//Найдена правильная страница
if (_page != null)
{
//Создаются элементы управления
_page.Init += new EventHandler(_page_Init);
//Заполняются списочные элементы управления (например, выпадающие)
_page.Load += new EventHandler(_page_Load);
}
else
{
return;
}
}
else
{
return;
}
}
Шаг 3: Класс ControlCreation.cs по сути создает динамические элементы управления. Элементы управления помещаются в таблицу для надлежащей расстановки.
//Функция: CreateControls
//Назначение: Создание элементов управления
public void CreateControls(System.Web.UI.Page _pg)
{
//Построение элементов управления
BuildGrid(_table, _lblName, _lblAge,
_lblCountry, _txtAge, _txtName, _rdBLstSex, _ddCountryList, _btnSubmit);
_pg.Form.Controls.Add(_table);
}
Шаг 4: Класс ControlCreation.cs по сути создает динамические элементы управления. Элементы управления помещаются в таблицу для надлежащей расстановки.
//Функция: CreateControls
//Назначение: Создание элементов управления
public void CreateControls(System.Web.UI.Page _pg)
{
//Построение элементов управления
BuildGrid(_table, _lblName, _lblAge, _lblCountry,
_txtAge, _txtName, _rdBLstSex, _ddCountryList, _btnSubmit);
_pg.Form.Controls.Add(_table);
}
Шаг 5: Класс FillCountry.cs отвечает за заполнение выпадающего списка стран.
//Имя функции: PopulateCountry
//Назначение: Заполнение выпадающего списка стран
public void PopulateCountry(System.Web.UI.Page _pg)
{
DataTable _dtCountry = GetCountryList();
DropDownList _ddlCountryList =
_pg.FindControl("ddlCountryList") as DropDownList;
_ddlCountryList.AutoPostBack = true;
if (_dtCountry != null)
{
if (_dtCountry.Rows.Count > 0)
{
AddBlankRow(ref _dtCountry, 0);
Populate(_dtCountry, _ddlCountryList);
}
}
}
Шаг 6: Текстовое поле «Возраст» разрешает только числовое значение. Функция JavaScript AllowNumeric() написана в файле Validation.js. Также пользователь не может ввести возраст больше 50 лет, который вызывается кнопкой «Отправить».
private void ButtonAttributes(out Button _btnSubmit)
{
_btnSubmit = new Button();
_btnSubmit.ID = "btnSubmit";
_btnSubmit.Text = "Submit";
_btnSubmit.Style.Add("background", "#ffeec6");
_btnSubmit.Attributes.Add("onmouseover", "this.style.background='orange'");
_btnSubmit.Attributes.Add("onmouseout", "this.style.background='#ffeec6'");
_btnSubmit.Attributes.Add("onClick", "return CheckAge('txtAge');");
//Если найдена правильная страница, то осуществляется доступ к данным
_btnSubmit.Click += new EventHandler(_btnSubmit_Click);
}
Шаг 7: Для доступа к данным после проверки страницы запускается событие щелчком кнопки «Отправить».
private string AccessControlValues(string _value)
{
if (_page.FindControl("txtName") != null)
{
TextBox _txtName = (TextBox)_page.FindControl("txtName");
_value = _txtName.Text;
}
if (_page.FindControl("txtAge") != null)
{
TextBox _txtAge = (TextBox)_page.FindControl("txtAge");
_value = _txtAge.Text;
}
if (_page.FindControl("ddlCountryList") != null)
{
DropDownList _ddlCountryList =
(DropDownList)_page.FindControl("ddlCountryList");
_value = _ddlCountryList.SelectedItem.Text;
}
return _value;
}
Регистрация Httpmodule
Ранее было объяснено, как это делается. Однако был вставлен раздел конфигурации для этого пробного приложения
<httpModules> < add name="DynamicControls" type="DynamicControls"></httpModules>
Преимущества модулей HTTP
Модули HTTP – удобный инструмент для разработчиков ASP.NET. Некоторые из преимуществ перечислены здесь:
1. Модули HTTP могут быть добавлены на уровне сайта, папки или файла, в отличие от фильтров ISAPI, добавляемых только на глобальном уровне или на уровне сайта.
2. Могут повторно использоваться по всему приложению.
Заключение
Показан предназначенный в основном для новичков пример небольшой задачи, выполняемой модулями HTTP. Это лишь капля в море. Истинная мощь модулей HTTP безмерна, например:
a. Пользовательский механизм кеширования и обработки сессии
b. Преобразование HTTP в HTTPS и наоборот
c. Аутентификация пользователей и т.д.