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é)
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.