Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Un peu de bulle ? Où comment faire remonter un événement avec OnBubbleEvent - RaiseBubbleEvent

Lorsque l'on met un LinkButton dans un Repeater, comment ce fait-il que si l'on clique sur le linkbutton alors l'événement ItemCommand du Repeater est declenché ?

<script type="text/C#" runat="server"> protected void Page_Load(object sender, EventArgs e) { rptTest.DataSource = new int[] { 1, 2, 3 }; rptTest.DataBind(); } protected void rptTest_ItemCommand(object source, RepeaterCommandEventArgs e) { lblTest.Text = DateTime.Now.ToLongTimeString(); } </script> <asp:Repeater runat="server" ID="rptTest" OnItemCommand="rptTest_ItemCommand"> <ItemTemplate> <asp:LinkButton runat="server" ID="lbTest">Click Me !</asp:LinkButton> </ItemTemplate> </asp:Repeater> <asp:Label runat="server" ID="lblTest" />

Il s'agit bien de l'événement ItemCommand du Repeater qui est declenché, pourquoi ?

Si l'on ne connait pas le fonctionnement d'un postback cela peut vous paraitre naturel. Voici une explication rapide du fonctionnement d'un postback. Regardons tout d'abord le code HTML généré par l'exemple plus haut, on voit que le LinkButton s'est transformé en :

<a id="rptTest_ctl00_lbTest" href="javascript:__doPostBack('rptTest$ctl00$lbTest','')">Click Me !</a> <script type="text/javascript"> //<![CDATA[ var theForm = document.forms['form1']; if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]> </script>

Lorsque l'on on clique sur le lien, on appelle la méthode __doPostBack qui va renseigner le champ caché __EVENTTARGET par le UniqueID du LinkButton, puis va envoyer le formulaire grâce à la méthode submit.

Côté serveur, le cycle de vie de la page se poursuit classiquement, Init, Load, ... Lorsque tous les contrôles sont recréés c'est au tour de la méthode RaisePostBackEvent d'intervenir. Cette méthode récupère le contrôle source en faisant un FindControl avec Request.Form["__EVENTTARGET"]. Si ce contrôle est trouvé et qu'il implémente IPostBackEventHandler alors la méthode RaisePostBackEvent de celui-ci est appelée avec en paramètre le contenu de Request.Form["__EVENTARGUMENT"]. C'est pour cela que si vous faîtes un contrôle faisant un PostBack, il faut implémenter IPostBackEventHandler.

public interface IPostBackEventHandler { void RaisePostBackEvent(string eventArgument); }

Dans Notre cas la méthode RaisePostBackEvent du LinkButton est directement appellé, le Repeater ne peut pas l'intercepter, alors comment déclenche t'il son événement ItemCommand ?

En fait, ASP.net permet de remonter un événement. Pour cela il faut appeler la méthode RaiseBubbleEvent dans la méthode RaisePostBackEvent.

C'est justement ce que je viens de rajouter à mon PostBackControl :

public void RaisePostBackEvent(string eventArgument) { CommandEventArgs e = null; // ... if (CallBack != null) { CallBack.Invoke(this, e); } base.RaiseBubbleEvent(this, e); }

Nous avons donc remonté l'événement dans l'arbre de contrôle. Pour que le Repeater intercepte cet événement il lui faut surcharger la méthode OnBubbleEvent qui renvoie vrai si l'on veut arrêter la propagation.

Voici un exemple :

protected override bool OnBubbleEvent(object source, EventArgs e) { if (e is NewsListEventArgs) { NewsListEventArgs args = (NewsListEventArgs)e; if (args.CommandName.Equals("Activate")) { // On séléctionne le nouvel SelectedDataKey this.ActiveDatakey = GetDataKey(args.Item.ItemIndex); OnActiveIndexChanged(args); return true; } } return false; }

Cette astuce s'avère très pratique lorsque l'on fait des contrôles pérsonalisés très riche.

Posted: dimanche 9 décembre 2007 23:35 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

jupolj a dit :

Bon à savoir !

# décembre 10, 2007 10:28
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01