Создание серверных элементов управления во время выполнения с помощью модулей HTTP
ОГЛАВЛЕНИЕ
В данной статье показано, как создать динамический серверный элемент управления с помощью модулей HTTP.
Введение
В данной статье показано очень простое приложение, созданное с помощью модулей HTTP.
Все дело в генерации динамических серверных элементов управления ASP.NET с помощью модулей HTTP. Приложение является простой формой с двумя элементами управления типа текстового поля – имя и возраст, и с выпадающим списком стран с кнопкой.
Целью было создать управляющие элементы во время выполнения, заполнить списочные управляющие элементы, выполнить некоторые клиентские проверки и после проверки страницы обратиться к значениям элемента управления.
Предпосылки
Создавать элементы управления во время выполнения в ASP.NET очень приятно, и это легко делается многими способами. В интернете есть ряд хороших статей. Но было решено попробовать сделать это иначе с помощью модулей 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. Аутентификация пользователей и т.д.