L'article précédent a présenté les concepts de base de la mise en œuvre d'événements de contrôle de serveur personnalisés. Cet article explique comment capturer les événements de rappel à travers des exemples typiques.
1. Implémentez la capture des événements de publication.
Si un contrôle serveur doit capturer les événements de publication du client et souhaite personnaliser la logique de traitement des événements côté serveur pour les événements de publication, le contrôle doit implémenter l'interface System.Web.UI.IPostBackEventHandler. La définition de l'interface est répertoriée ci-dessous.
interface publique IPostBackEventHandler
{
void RaisePostBackEvent (string eventArgument);
}
Comme indiqué dans le code ci-dessus, l'interface IPostBackEventHandler n'inclut qu'une seule méthode membre RaisePostBackEvent. Cette méthode permet au contrôle serveur de gérer les événements déclenchés lorsque le formulaire est envoyé au serveur. Son paramètre eventArgument représente les paramètres d'événement facultatifs à transmettre au gestionnaire d'événements. Les développeurs peuvent implémenter la logique effectuée lors du processus de publication du contrôle du serveur dans la méthode RaisePostBackEvent. En règle générale, la méthode RaisePostBackEvent déclenche un ou plusieurs événements côté serveur. L'extrait de code suivant montre l'implémentation de RaisePostBackEvent qui déclenche l'événement Click sur le serveur.
public void RaisePostBackEvent (String eventArgument)
{
OnClick(EventArgs.Empty);
}
Pour parvenir à capturer les événements de publication, il ne suffit pas de simplement demander à la classe de contrôle du serveur d'implémenter l'interface IPostBackEventHandler et d'implémenter les méthodes membres de cette interface. Les développeurs doivent également prêter attention à la mise en œuvre d’autres choses. Vous trouverez ci-dessous trois points clés dans le processus de capture des événements de publication.
Tout d’abord et surtout, la classe de contrôle serveur personnalisée doit implémenter l’interface IPostBackEventHandler et implémenter la méthode RaisePostBackEvent membre de l’interface. Ce processus a été décrit ci-dessus.
Deuxièmement, attribuez un UniqueID au contrôle.
Définir la valeur de l'attribut name du contrôle qui fait que l'événement de publication est UniqueID est l'une des clés pour implémenter correctement la méthode RaisePostBackEvent. Lorsqu'une publication est déclenchée, l'infrastructure de page recherche le contenu envoyé et détermine si le nom de l'objet d'envoi correspond à l'UniqueID du contrôle serveur qui implémente IPostBackEventHandler. Si cela correspond, le framework de page appellera la méthode RaisePostBackEvent sur le contrôle. Le point clé ici est que les développeurs doivent attribuer UniqueID à l’attribut name du contrôle dans la logique de rendu. Un exemple de code simple est répertorié ci-dessous.
remplacement protégé void Render (sortie HtmlTextWriter)
{
output.Write("<INPUT TYPE=submit name="+this.UniqueID+"Value='Click Me' />");
}
Comme le montre le code ci-dessus, dans la méthode de rendu de contrôle Render, un bouton est présenté, dont la valeur d'attribut de nom est UniqueID. Ce n'est que lorsque l'attribut name du contrôle qui provoque la publication reçoit un ID unique que l'événement de publication peut être capturé correctement.
Troisièmement, implémentez la structure des attributs d'événement.
La structure des attributs d'événement est un moyen optimisé d'implémenter des événements. Avant de présenter, examinons d'abord les méthodes courantes de mise en œuvre des événements de contrôle. Le code spécifique est le suivant.
...
classe publique WebCustomControl:WebControl,IPostBackEventHandler{
//Déclare l'événement public du délégué d'événement Click EventHandler Click;
// Implémentez la méthode RaisePostBackEvent void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Empty);
}
//Définir le gestionnaire d'événements OnClick protégé virtual void OnClick(EventArgs e) {
if(Cliquez != null) { Cliquez(this,e) ;
}
...
}
Dans le code ci-dessus, trois contenus clés liés à la définition d'événement sont inclus : 1. Définir le délégué d'événement Click ; 2. La classe de contrôle implémente l'interface IPostBackEventHandler, dans laquelle le gestionnaire d'événements OnClick est défini lors de l'implémentation de la méthode membre d'interface RaisePostBackEvent. ;3. Implémentez le gestionnaire d'événements OnClick. La méthode de mise en œuvre ci-dessus est simple et facile à utiliser, mais elle présente un inconvénient, à savoir une faible efficacité d'exécution. Surtout lorsque plusieurs événements sont déclenchés dans une classe, cela augmentera la surcharge, gaspillera beaucoup de ressources du serveur et entraînera finalement une réduction de l'efficacité opérationnelle.
Afin de résoudre les problèmes ci-dessus, une structure optimisée d'attributs d'événement et de méthode de mise en œuvre d'événement est présentée ci-dessous. Cette structure utilise la classe System.ComponentModel.EventHandlerList, qui fournit une simple liste de délégués. En utilisant les méthodes associées fournies par cette classe, les développeurs peuvent manipuler de manière flexible la liste des délégués du gestionnaire d’événements du contrôle. Par exemple, l'événement Click dans le contrôle utilise la structure d'attribut d'événement comme suit :
objet statique protégé en lecture seule EventClick = new object();
événement public EventHandler Cliquez sur {
ajouter {
Events.AddHandler(EventClick,valeur);
}
retirer {
Events.RemoveHandler(EventClick,valeur);
}
}
Avant de définir la structure des attributs d'événement, vous devez d'abord définir l'objet délégué d'événement Click. Puisque chaque événement n’est créé qu’une seule fois, il doit être déclaré statique et en lecture seule. Ensuite, exploitez la liste des délégués du gestionnaire d’événements via les méthodes AddHandler et RemoveHandler dans la structure des propriétés. Lorsque la page appelle l'événement Click, elle ajoute ou supprime des gestionnaires de la collection EventHandlerList du contrôle. Étant donné que cette méthode d'implémentation est plus efficace que la méthode d'implémentation ordinaire dans le processus de déclaration de plusieurs événements, c'est une méthode très recommandée.
De plus, lors de l'implémentation de la méthode OnClick, lors de l'utilisation d'un attribut d'événement, le délégué doit être récupéré de EventHandlerList et converti en type EventHandler.
vide virtuel protégé OnClick (EventArgs e) {
EventHandler clickHandler = (EventHandler)Events[EventClick];
si(clicHandler != null) {
clickHandler(this,e);
}
}
Veuillez noter aux lecteurs : la structure des attributs d'événement n'est pas applicable au langage VB.NET et ne peut être appliquée que dans des langages tels que C#.
2. Applications typiques
Pour être honnête, l'introduction théorique ci-dessus à la capture des événements de publication est quelque peu difficile à comprendre pour les lecteurs qui n'ont jamais implémenté d'événements de contrôle de serveur. À cette fin, cette section utilise un exemple typique pour illustrer spécifiquement la méthode d’implémentation de capture des événements de retour.
Cet exemple implémente un contrôle serveur personnalisé WebCustomControl. Bien que ce contrôle apparaisse sous la forme d’un bouton, il n’hérite pas de la classe Button. Lorsque vous cliquez sur le bouton, le contrôle provoquera une publication et le serveur capturera automatiquement l'événement de clic renvoyé, déclenchera l'événement Click et exécutera le gestionnaire d'événement correspondant. Voici le code source de l'implémentation du contrôle serveur :
utiliser le système ; en utilisant System.Collections.Generic ; en utilisant System.ComponentModel ; en utilisant System.Text ; en utilisant System.Web ; en utilisant System.Web.UI ; en utilisant System.Web.UI.WebControls ; espace de noms WebControlLibrary{ [DefaultEvent("Click")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] classe publique WebCustomControl : WebControl, IPostBackEventHandler { //Définir un objet délégué d'événement Click objet statique privé en lecture seule EventClick = new object(); // Implémenter les propriétés de l'événement Click [Description("Propriétés de l'événement Click"), Category("Action") ] événement public EventHandler Cliquez sur { ajouter { Events.AddHandler (EventClick, valeur); } retirer { Events.RemoveHandler (EventClick, valeur); } } // Remplace la méthode de rendu du contrôle RenderContents remplacement protégé void RenderContents (sortie HtmlTextWriter) { output.Write("<input type='submit' name=" + this.UniqueID + " value=Veuillez cliquer/>"); } // Implémenter la méthode d'événement protégée virtual void OnClick (EventArgs e) { EventHandler clickHandler = (EventHandler)Events[EventClick]; si (clickHandler != null) { clickHandler(ce, e); } } // Implémentation du membre de l'interface IPostBackEventHandler 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="serveur"> void wcc1_Click (expéditeur de l'objet, EventArgs e) { message.Text = "Vous venez de cliquer sur le bouton ci-dessus"; } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="serveur"> <title>Capturer les événements de publication</title> </tête> <corps> <form id="form1" runat="serveur"> <centre> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="message" runat="server"></asp:Label> </centre> </form> </corps> </html> |
Figure 1 Rendus d'initialisation de page Figure 2 Effets après avoir cliqué sur le bouton |
//Définit l'attribut AutoPostBack public bool AutoPostBack{ ensemble { this._autoPostBack = valeur ; } obtenir { renvoie this._autoPostBack ; } } //Ajout de la méthode Page.GetPostBackEventReference() dans la méthode Render remplacement protégé void Render (sortie HtmlTextWriter) { ... si(this.AutoPostBack) { writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this)); } ... } |