.net 2 - utilisation du clientcallback au sein d'un controle + declenchement d'evenement

Description

J'ai fait ce petit controle pour expliquer comment fonctionne le ClientCallBack et ce qu'on peut en faire.

Ce controle est volontairement trés simple et en l'etat completement inutile, mais c'est fait exprés pour que l'on puisse bien comprendre le fonctionnement.

Ce controle ecrit l'heure du serveur, et se remet à jour automatiquement lorsqu'on passe la souris dessus grace au ClientCallBack ( Ajax )

Ce controle declenche un evenement mouseOver son delegates possede 3 arguments, les 2 premiers classique, un object qui est le controle, et un eventArgs, le 3eme est ce qui devra etre renvoyé à javascript, cet argument est passé en reférence.

Vous pourrez trouver d'avantages d'explications dans un article qui se trouve ici http://www.c2i.fr/code.aspx?IDCode=610

Source / Exemple :


'Le controle 
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI

<ToolboxData("<{0}:ControlExemple runat=""server""></{0}:ControlExemple>")> _
Public Class ControlExemple
    Inherits Control
    Implements ICallbackEventHandler

    Public Event MouseOver As EventHandler(Of MouseOverEventArgs)
    ' delegate un peu spécial, il a la meme signature que les autres, mais prend en plus un paramètre par référence
    Public Delegate Sub ExempleEventHandler(ByVal sender As Object, ByVal e As EventArgs)

    'on ecrit le controle en surchargeant le render
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        writer.Write("Survoler l'heure pour la mettre à jour <br /> <span ")
        writer.WriteAttribute("id", Me.UniqueID)
        writer.WriteAttribute("onmouseover", _
                Me.Page.ClientScript.GetCallbackEventReference(Me, _
                    "this.innerHTML", "__onCallBackTermine", "'" & Me.UniqueID & "'"))
        writer.Write(">")
        writer.Write(Now.ToLongTimeString)
        writer.Write("</span>")
        MyBase.Render(writer)
    End Sub

    ' function appelé quand la souris passe sur notre lien 
    ' c'est ici qu'on declenche notre evenement
    Public Function RaiseCallbackEvent(ByVal eventArgument As String) As String Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
        Dim e As New MouseOverEventArgs(eventArgument)
        RaiseEvent MouseOver(Me, e)
        Return e.NouvelleHeure
    End Function

    ' Ici on ecrit la fonction qui sera appellé au retour du callback
    Private Sub ControlExemple_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        If Not Me.Page.ClientScript.IsClientScriptBlockRegistered("callback") Then
            Dim script As New StringBuilder
            script.AppendLine("function __onCallBackTermine(result, context)")
            script.AppendLine("{")
            script.AppendLine("document.getElementById(context).innerHTML = result;")
            script.AppendLine("}")
            Me.Page.ClientScript.RegisterClientScriptBlock(GetType(ControlExemple), "callback", script.ToString, True)
        End If
    End Sub

End Class

Public Class MouseOverEventArgs
    Inherits EventArgs

    Private _nouvelleHeure As String

    Public Property NouvelleHeure() As String
        Get
            Return _nouvelleHeure
        End Get
        Set(ByVal value As String)
            _nouvelleHeure = value
        End Set
    End Property

    Private _AncienneHeure As String

    Public ReadOnly Property AncienneHeure() As String
        Get
            Return _AncienneHeure
        End Get
    End Property

    Public Sub New(ByVal ancienneheure As String)
        _AncienneHeure = ancienneheure
    End Sub

End Class

' La page 

Partial Class Default3
    Inherits System.Web.UI.Page

    ' cet evenement est declenché coté serveur quand le client passe la souris sur l'heure, attention
    ' la page n'est pas renvoyé, c'est juste l'argument result qui est renvoyé par javascript
    Protected Sub ControlExemple1_MouseOver(ByVal sender As Object, ByVal e As System.EventArgs) Handles ControlExemple1.MouseOver
        e.NouvelleHeure = Now.ToLongTimeString
    End Sub

End Class

Conclusion :


Cette technique à l'air génial mais il ne faut pas oublier que la requete a été effectué via javascript et que la response ne comportera QUE le resultat de la fonction RaiseCallbackEvent. Toutefois la page passera par tous les autres evenements excepté le render, y compris le load de la page ...

Donc si vous avez des traitements lourds et inutile pour un callBack, qui se font dans le page_load, il vous faudra vérifier si la requete provient d'un CallBack. Tout comme on avait la propriété page.isPostBack pour savoir si la page provient d'un postback on a naturellement la propriété page.isCallBack qui fera ce que son nom indique.

Ceci est bien sur du .net 2 et impossible en .net 1 (ou alors extremement compliqué)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.