В предыдущей статье были представлены основные концепции реализации пользовательских событий управления сервером. В этой статье на типичных примерах объясняется, как фиксировать события обратного вызова.
1. Реализуйте захват событий обратной передачи.
Если серверному элементу управления необходимо перехватывать события обратной передачи от клиента и требуется настроить логику обработки событий на стороне сервера для событий обратной передачи, тогда элемент управления должен реализовать интерфейс System.Web.UI.IPostBackEventHandler. Определение интерфейса приведено ниже.
общедоступный интерфейс IPostBackEventHandler
{
void RaisePostBackEvent (строка eventArgument);
}
Как показано в приведенном выше коде, интерфейс IPostBackEventHandler включает только один метод-член RaisePostBackEvent. Этот метод позволяет серверному элементу управления обрабатывать события, возникающие при отправке формы на сервер. Его параметр eventArgument представляет собой необязательные параметры событий, которые должны быть переданы обработчику событий. Разработчики могут реализовать логику, выполняемую во время процесса обратной передачи управления сервером, в методе RaisePostBackEvent. Обычно метод RaisePostBackEvent вызывает одно или несколько событий на стороне сервера. В следующем фрагменте кода показана реализация RaisePostBackEvent, которая вызывает событие Click на сервере.
public void RaisePostBackEvent (String eventArgument)
{
OnClick(EventArgs.Empty);
}
Чтобы добиться перехвата событий обратной передачи, недостаточно просто заставить класс управления сервером реализовать интерфейс IPostBackEventHandler и реализовать методы-члены этого интерфейса. Разработчикам также необходимо обратить внимание на реализацию других вещей. Ниже перечислены три ключевых момента в процессе регистрации событий обратной передачи.
Во-первых, и это наиболее важно, пользовательский класс управления сервером должен реализовать интерфейс IPostBackEventHandler и реализовать метод RaisePostBackEvent члена интерфейса. Этот процесс был описан выше.
Во-вторых, присвойте элементу управления UniqueID.
Определение значения атрибута name элемента управления, который приводит к тому, что событие обратной передачи будет UniqueID, является одним из ключей к правильной реализации метода RaisePostBackEvent. При запуске обратной передачи платформа страницы ищет отправляемое содержимое и определяет, соответствует ли имя отправляющего объекта уникальному идентификатору серверного элемента управления, реализующего IPostBackEventHandler. Если это соответствует, платформа страницы вызовет метод RaisePostBackEvent элемента управления. Ключевым моментом здесь является то, что разработчикам необходимо присвоить UniqueID атрибуту имени элемента управления в логике рендеринга. Простой пример кода приведен ниже.
защищенное переопределение void Render (вывод HtmlTextWriter)
{
output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='Click Me' />");
}
Как показано в приведенном выше коде, в методе рендеринга элемента управления Render представлена кнопка, значение атрибута имени которой равно UniqueID. Событие обратной передачи можно правильно зафиксировать только в том случае, если атрибуту имени элемента управления, вызывающего обратную передачу, присвоен уникальный идентификатор.
В-третьих, реализуйте структуру атрибутов событий.
Структура атрибутов событий — это оптимизированный способ реализации событий. Прежде чем представиться, давайте сначала рассмотрим общие методы реализации событий управления. Конкретный код выглядит следующим образом.
...
общественный класс WebCustomControl: WebControl, IPostBackEventHandler {
//Объявляем делегата события Click public event EventHandler Click;
//Реализуем метод RaisePostBackEvent void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Empty);
}
//Определение обработчика событий OnClick protected virtual void OnClick(EventArgs e) {
if(Click != null) { Click(this,e });
}
...
}
В приведенном выше коде включены три ключевых содержимого, связанных с определением события: 1. Определение делегата события Click. 2. Класс управления реализует интерфейс IPostBackEventHandler, в котором обработчик событий OnClick определяется при реализации метода-члена интерфейса RaisePostBackEvent. ;3. Реализуйте обработчик события OnClick. Описанный выше способ реализации прост и удобен в использовании, но имеет недостаток – низкую эффективность выполнения. Особенно когда в классе инициируется несколько событий, это увеличивает накладные расходы, тратит много ресурсов сервера и в конечном итоге приводит к снижению эффективности работы.
Чтобы решить вышеуказанные проблемы, ниже представлена оптимизированная структура атрибутов метода-события реализации события. Эта структура использует класс System.ComponentModel.EventHandlerList, который предоставляет простой список делегатов. Используя связанные методы, предоставляемые этим классом, разработчики могут гибко манипулировать списком делегатов обработчика событий элемента управления. Например, событие Click в элементе управления использует следующую структуру атрибутов события:
защищенный статический объект только для чтения EventClick = new object();
публичное событие EventHandler Click{
добавлять {
Events.AddHandler(EventClick,value);
}
удалять {
Events.RemoveHandler(EventClick,value);
}
}
Прежде чем определять структуру атрибутов события, сначала необходимо определить объект делегата события Click. Поскольку каждое событие создается только один раз, его необходимо объявить статическим и доступным только для чтения. Затем управляйте списком делегатов обработчика событий с помощью методов AddHandler и RemoveHandler в структуре свойств. Когда страница вызывает событие Click, она добавляет или удаляет обработчики из коллекции EventHandlerList элемента управления. Поскольку этот метод реализации более эффективен, чем обычный метод реализации в процессе объявления нескольких событий, это очень рекомендуемый метод.
Кроме того, во время реализации метода OnClick при использовании атрибута события делегат необходимо получить из EventHandlerList и преобразовать в тип EventHandler.
защищенная виртуальная пустота OnClick (EventArgs e) {
EventHandler clickHandler = (EventHandler)Events[EventClick];
если (clickHandler! = ноль) {
clickHandler (это, е);
}
}
Обратите внимание читателям: структура атрибутов событий неприменима к языку VB.NET и может применяться только в таких языках, как C#.
2. Типичные применения
Честно говоря, приведенное выше теоретическое введение в захват событий обратной передачи несколько сложно понять читателям, которые никогда не реализовывали события управления сервером. С этой целью в этом разделе используется типичный пример, специально иллюстрирующий метод реализации перехвата возвращаемых событий.
В этом примере реализуется пользовательский серверный элемент управления WebCustomControl. Хотя этот элемент управления выглядит как кнопка, он не наследуется от класса Button. При нажатии кнопки элемент управления вызывает обратную передачу, и сервер автоматически захватывает возвращенное событие щелчка, запускает событие Click и выполняет соответствующий обработчик событий. Ниже приведен исходный код реализации управления сервером:
использование системы; использование System.Collections.Generic; использование System.ComponentModel; использование System.Text; использование System.Web; использование System.Web.UI; использование System.Web.UI.WebControls; пространство имен WebControlLibrary { [DefaultEvent («Клик»)] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] общедоступный класс WebCustomControl: WebControl, IPostBackEventHandler { //Определение объекта делегата события Click. Частный статический объект только для чтения EventClick = new object(); //Реализовать свойства события клика [Description("Свойства события клика"), Категория("Действие") ] публичное событие EventHandler Click { добавлять { Events.AddHandler(EventClick, значение); } удалять { Events.RemoveHandler(EventClick, значение); } } // Переопределить метод рендеринга элемента управления RenderContents защищенное переопределение void RenderContents (выход HtmlTextWriter) { output.Write("<input type='submit' name=" + this.UniqueID + " value=Please click/>"); } //Реализуем метод события protected virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)Events[EventClick]; если (clickHandler!= ноль) { clickHandler(это, е); } } // Реализуем член интерфейса IPostBackEventHandler void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Empty); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Регистрация TagPrefix="cc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="сервер"> void wcc1_Click (отправитель объекта, EventArgs e) { message.Text = "Вы только что нажали кнопку выше"; } </скрипт> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="сервер"> <title>Захват событий обратной передачи</title> </голова> <тело> <form id="form1" runat="server"> <центр> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="message" runat="server"></asp:Label> </центр> </форма> </тело> </html> |
Рисунок 1. Визуализация инициализации страницы. Рисунок 2. Эффекты после нажатия кнопки. |
//Определяем атрибут AutoPostBack общественный bool AutoPostBack{ набор { this._autoPostBack = значение; } получать { верните это._autoPostBack; } } //Добавляем метод Page.GetPostBackEventReference() в метод Render защищенное переопределение void Render (выход HtmlTextWriter) { ... если (this.AutoPostBack) { Writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this)); } ... } |