• Microsoft .NET
  • ASP.NET
  • Отображение случайно выбранного изображения на веб-странице 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.    Аутентификация пользователей и т.д.