Im vorherigen Artikel wurden die Grundkonzepte der Implementierung benutzerdefinierter Serversteuerungsereignisse vorgestellt. In diesem Artikel wird anhand typischer Beispiele erläutert, wie Rückrufereignisse erfasst werden.
1. Implementieren Sie die Erfassung von Postback-Ereignissen.
Wenn ein Serversteuerelement Postback-Ereignisse vom Client erfassen muss und die serverseitige Ereignisverarbeitungslogik für die Postback-Ereignisse anpassen möchte, muss das Steuerelement die Schnittstelle System.Web.UI.IPostBackEventHandler implementieren. Die Schnittstellendefinition ist unten aufgeführt.
öffentliche Schnittstelle IPostBackEventHandler
{
void RaisePostBackEvent(string eventArgument);
}
Wie im obigen Code gezeigt, enthält die IPostBackEventHandler-Schnittstelle nur eine Mitgliedsmethode RaisePostBackEvent. Mit dieser Methode kann das Serversteuerelement Ereignisse verarbeiten, die ausgelöst werden, wenn das Formular an den Server gesendet wird. Sein Parameter eventArgument stellt die optionalen Ereignisparameter dar, die an den Ereignishandler übergeben werden sollen. Entwickler können die Logik, die während des Serversteuerungs-Postback-Prozesses ausgeführt wird, in der RaisePostBackEvent-Methode implementieren. Normalerweise löst die RaisePostBackEvent-Methode ein oder mehrere serverseitige Ereignisse aus. Der folgende Codeausschnitt zeigt die RaisePostBackEvent-Implementierung, die das Click-Ereignis auf dem Server auslöst.
public void RaisePostBackEvent(String eventArgument)
{
OnClick(EventArgs.Empty);
}
Um die Erfassung von Postback-Ereignissen zu erreichen, reicht es nicht aus, die Serversteuerklasse einfach dazu zu bringen, die IPostBackEventHandler-Schnittstelle und die Mitgliedsmethoden dieser Schnittstelle zu implementieren. Entwickler müssen auch auf die Implementierung anderer Dinge achten. Nachfolgend sind drei wichtige Punkte beim Erfassen von Postback-Ereignissen aufgeführt.
Zunächst und vor allem muss die benutzerdefinierte Serversteuerklasse die IPostBackEventHandler-Schnittstelle und die RaisePostBackEvent-Methode des Schnittstellenmitglieds implementieren. Dieser Vorgang wurde oben beschrieben.
Zweitens weisen Sie dem Steuerelement eine UniqueID zu.
Das Definieren des Namensattributwerts des Steuerelements, das bewirkt, dass das Postback-Ereignis UniqueID ist, ist einer der Schlüssel zur korrekten Implementierung der RaisePostBackEvent-Methode. Wenn ein Postback ausgelöst wird, sucht das Seitenframework nach dem gesendeten Inhalt und ermittelt, ob der Name des sendenden Objekts der UniqueID des Serversteuerelements entspricht, das IPostBackEventHandler implementiert. Wenn dies der Fall ist, ruft das Seitenframework die RaisePostBackEvent-Methode für das Steuerelement auf. Der entscheidende Punkt hierbei ist, dass Entwickler dem Namensattribut des Steuerelements in der Rendering-Logik UniqueID zuweisen müssen. Ein einfaches Codebeispiel ist unten aufgeführt.
protected override void Render(HtmlTextWriter-Ausgabe)
{
Output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='Click Me' />");
}
Wie im obigen Code gezeigt, wird in der Steuerelement-Rendering-Methode Render eine Schaltfläche angezeigt, deren Namensattributwert UniqueID ist. Nur wenn dem Namensattribut des Steuerelements, das das Postback verursacht, eine UniqueID zugewiesen wird, kann das Postback-Ereignis korrekt erfasst werden.
Drittens implementieren Sie die Ereignisattributstruktur.
Die Ereignisattributstruktur ist eine optimierte Möglichkeit, Ereignisse zu implementieren. Schauen wir uns vor der Einführung zunächst die gängigen Methoden zur Implementierung von Steuerereignissen an. Der spezifische Code lautet wie folgt.
...
öffentliche Klasse WebCustomControl:WebControl,IPostBackEventHandler{
//Deklarieren Sie das Click-Ereignis, delegieren Sie das öffentliche Ereignis EventHandler Click;
//Implementieren Sie die RaisePostBackEvent-Methode void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Empty);
}
//OnClick-Ereignishandler definieren protected virtual void OnClick(EventArgs e) {
if(Click != null) { Click(this,e }
}
...
}
Im obigen Code sind drei wichtige Inhalte im Zusammenhang mit der Ereignisdefinition enthalten: 1. Definieren Sie den Click-Ereignisdelegaten. 2. Die Steuerklasse implementiert die IPostBackEventHandler-Schnittstelle, in der der Ereignishandler OnClick bei der Implementierung der Schnittstellenmitgliedsmethode RaisePostBackEvent definiert wird. ;3. Implementieren Sie den OnClick-Ereignishandler. Die obige Implementierungsmethode ist einfach und benutzerfreundlich, weist jedoch einen Nachteil auf, nämlich eine geringe Ausführungseffizienz. Insbesondere wenn in einer Klasse mehrere Ereignisse ausgelöst werden, erhöht sich der Overhead, es werden viele Serverressourcen verschwendet und letztendlich die Betriebseffizienz verringert.
Um die oben genannten Probleme zu lösen, wird im Folgenden eine optimierte Ereignisimplementierungsmethode-Ereignisattributstruktur vorgestellt. Diese Struktur verwendet die Klasse System.ComponentModel.EventHandlerList, die eine einfache Delegatenliste bereitstellt. Durch die Verwendung der von dieser Klasse bereitgestellten zugehörigen Methoden können Entwickler die Event-Handler-Delegatenliste des Steuerelements flexibel bearbeiten. Beispielsweise verwendet das Click-Ereignis im Steuerelement die Ereignisattributstruktur wie folgt:
protected static readonly object EventClick = new object();
öffentliches Ereignis EventHandler Click{
hinzufügen {
Events.AddHandler(EventClick,value);
}
entfernen {
Events.RemoveHandler(EventClick,value);
}
}
Bevor Sie die Ereignisattributstruktur definieren, müssen Sie zunächst das Click-Ereignisdelegatenobjekt definieren. Da jedes Ereignis nur einmal erstellt wird, muss es als statisch und schreibgeschützt deklariert werden. Bedienen Sie dann die Event-Handler-Delegiertenliste über die Methoden AddHandler und RemoveHandler in der Eigenschaftsstruktur. Wenn die Seite das Click-Ereignis aufruft, fügt sie Handler zur EventHandlerList-Auflistung des Steuerelements hinzu oder entfernt sie daraus. Da diese Implementierungsmethode im Deklarationsprozess mehrerer Ereignisse effizienter ist als die normale Implementierungsmethode, handelt es sich um eine sehr empfehlenswerte Methode.
Darüber hinaus muss bei der Implementierung der OnClick-Methode bei Verwendung eines Ereignisattributs der Delegat aus der EventHandlerList abgerufen und in den EventHandler-Typ konvertiert werden.
protected virtual void OnClick(EventArgs e){
EventHandler clickHandler = (EventHandler)Events[EventClick];
if(clickHandler != null) {
clickHandler(this,e);
}
}
Bitte beachten Sie für die Leser: Die Ereignisattributstruktur gilt nicht für die VB.NET-Sprache und kann nur in Sprachen wie C# angewendet werden.
2. Typische Anwendungen
Ehrlich gesagt ist die obige theoretische Einführung in die Erfassung von Postback-Ereignissen für Leser, die noch nie Serversteuerungsereignisse implementiert haben, etwas schwer zu verstehen. Zu diesem Zweck wird in diesem Abschnitt anhand eines typischen Beispiels die Implementierungsmethode zur Erfassung von Rückgabeereignissen konkret veranschaulicht.
In diesem Beispiel wird ein benutzerdefiniertes Serversteuerelement WebCustomControl implementiert. Obwohl dieses Steuerelement als Schaltfläche angezeigt wird, erbt es nicht von der Button-Klasse. Wenn auf die Schaltfläche geklickt wird, löst das Steuerelement ein Postback aus und der Server erfasst automatisch das zurückgegebene Klickereignis, löst das Klickereignis aus und führt den entsprechenden Ereignishandler aus. Das Folgende ist der Quellcode der Serversteuerungsimplementierung:
Verwenden des Systems; mit System.Collections.Generic; mit System.ComponentModel; Verwenden von System.Text; mit System.Web; mit System.Web.UI; mit System.Web.UI.WebControls; Namespace WebControlLibrary{ [DefaultEvent("Click")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] öffentliche Klasse WebCustomControl: WebControl, IPostBackEventHandler { //Delegiertes Objekt für Click-Ereignisse definieren privates statisches schreibgeschütztes Objekt EventClick = new object(); //Klickereigniseigenschaften implementieren [Description("Klickereigniseigenschaften"), Kategorie("Aktion")] öffentliches Ereignis EventHandler Klicken Sie auf { hinzufügen { Events.AddHandler(EventClick, value); } entfernen { Events.RemoveHandler(EventClick, value); } } // Überschreibe die Steuerrendering-Methode RenderContents protected override void RenderContents(HtmlTextWriter-Ausgabe) { Output.Write("<input type='submit' name=" + this.UniqueID + " value=Please click/>"); } //Implementieren Sie die Ereignismethode protected virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)Events[EventClick]; if (clickHandler != null) { clickHandler(this, e); } } // IPostBackEventHandler-Schnittstellenmitglied implementieren void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Empty); } } } |
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register 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="server"> void wcc1_Click(object sender, EventArgs e) { message.Text = „Sie haben gerade auf die Schaltfläche oben geklickt“; } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Postback-Ereignisse erfassen</title> </head> <Körper> <form id="form1" runat="server"> <Mitte> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="message" runat="server"></asp:Label> </center> </form> </body> </html> |
Abbildung 1 Seiteninitialisierungs-Renderings Abbildung 2 Effekte nach dem Klicken auf die Schaltfläche |
//Definieren Sie das Attribut AutoPostBack öffentlicher bool AutoPostBack{ Satz { this._autoPostBack = value; } erhalten { return this._autoPostBack; } } //Fügen Sie die Methode Page.GetPostBackEventReference() zur Render-Methode hinzu protected override void Render(HtmlTextWriter-Ausgabe){ ... if(this.AutoPostBack) { write.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this)); } ... } |