cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008
-
4 déc. 2008 à 12:15
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008
-
8 déc. 2008 à 13:33
Bonjour,
J'essaye de faire un chat en asp. Le probleme est que je veux le faire sans rafraichir la page à chaque fois.
J'ai un timer coté client en javascript qui gère un callback.
Cependant, je n'arrive pas à récupérer le contenu de mon textbox (coté serveur) sans passer par un postback( qui celui-ci me fait rafraichir ma page).
Je débute en asp et est beaucoup de mal à comprendre la philosophie du truc.
Pouvez vous m'aider SVP
Public
Sub RaiseCallbackEvent(
ByVal eventArgument
As
String)
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent_callbackArg = eventArgument
End
Sub
Public
Function GetCallbackResult()
As
String
Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 5 déc. 2008 à 13:52
Bonjour,
Lors du callback, tu ne peux pas récupérer côté serveur le texte modifié de ton contrôle textbox à l'aide de textbox.text.
Tu as accès côté serveur seulement à l'état de départ de tes contrôles. Autrement dit, si ta textbox est vide au départ, tu récupéreras lors du callback, avec textbox.text, une chaîne vide.
Tu ne peux pas non plus attribuer une nouvelle valeur à un contrôle côté serveur de cette manière.
Le principe est en fait de récupérer le nouvel état de ton contrôle (le texte de la textbox, par exemple) côté client, avec du javascript, de l'envoyer au serveur, puis de traiter le retour serveur de nouveau côté client avec du javascript.
En bref, le callback ne te permet pas côté serveur de récupérer les modifications clients du contrôle, ni de modifier le contrôle : il te faut passer le texte de ton textbox en variable dans CallServer.
Dans ton exemple, tu peux par exemple récupérer ainsi la valeur du textbox en javascript, et provoquer le callback, avec ta fonction tTimer :
function tTimer()
{
var t=document.getElementById("TextBox1").value;
CallServer(t,'');
}
Côté serveur, tu pourras alors récupérer "t", qui contient la valeur de ta textbox, avec eventArgument, par exemple :
Private valeur As String
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) _
Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
valeur = eventArgument
End Sub
Public Function GetCallbackResult() As String Implements _
System.Web.UI.ICallbackEventHandler.GetCallbackResult
Select Case (valeur)
Case "essai"
Return "quelque chose"
Case Else
Return valeur
End Select
End Function
Si tu tapes n'importe quoi dans ta textbox, le label va afficher le contenu de ta textbox. Si tu tapes "essai", il va afficher le message "quelque chose".
Bien entendu, c'est un exemple gratuit, puisque pour faire ça, du pur javascript suffirait. C'est utile seulement pour récupérer des données serveur relativement simples sans postback.
Si tu veux faire quelque chose de complexe, peut-être devrais-tu plutôt le faire avec de l'Ajax qui va te faciliter la vie...
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008 5 déc. 2008 à 14:08
Merci beaucoup pour ta réponse.
C'est bel et bien ce que j'ai fini par faire à peu de chose près. (j'avais fini par trouver la solution)
Cependant, je serai très intéresssé par une version ajax.
J'ai beaucoup de mal à comprendre la philosophie ajax.
Si tu as le temps et si tu pouvais me donner une version équivalente de ce code en ajax, je pourais l'étudier.
car les exemples d'ajax que je trouve sont trop complèxe et j'ai du mal à synthétiser le système de communication client\serveur
Encore merci.
P.S: j'attends avec impatience ton explication ajax. Si tu n'as pas le temps ou ne veux pas t'embéter avec ca je comprendrai...
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 5 déc. 2008 à 16:10
Rebonjour,
Voici un exemple simple, qui fait à peu près la même chose que ci-dessus.
Dans un updatepanel ajax, j'ai mis deux labels, un qui reçoit le texte d'une textbox extérieure à cet updatepanel, l'autre qui affiche l'heure si on clique sur un bouton.
Dans l'updatepanel tu as donc deux "triggers" (qui pointent vers les contrôles extérieurs à l'update panel qui, sur un événement les affectant, vont déclencher le postback asynchrone). En l'occurrence, il s'agit d'un timer, règlé à 1000 (événement Tick), et d'un bouton asp (événément click). Ces deux événéments seront donc traités sans postback complet de la page.
Ces deux contrôles ont été mis en dehors de l'updatepanel. En l'occurrence, il aurait été aussi été possible de les mettre dedans (dans le contenttemplate, en supprimant les triggers).
Bien entendu, il faut que tu aies installé au préalable les composants ajax.
Un avantage parmi d'autres est que tu n'as pas à t'occuper du javascript, qui est généré automatiquement, et que tu as accès "normalement" à tes contrôles côté serveur.
Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)
Dim l As Label = CType(UpdatePanel1.FindControl("Label1"), Label)
If TextBox1.Text = "essai" Then
l.Text = "message ..."
Else
l.Text = TextBox1.Text
End If
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim l2 As Label = CType(UpdatePanel1.FindControl("Label2"), Label)
l2.Text = Date.Now
End Sub
</script>
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008 8 déc. 2008 à 09:22
Salut ggtry,
Mille fois merci pour ton code. Enfin un code ajax compréhensible.
Cependant, je ne vois pas quoi mettre à la place de ton lien.
Peux tu m'éclairer la dessus.
Encore merci
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008 8 déc. 2008 à 10:32
C'est encore moi!
Je n'arrive pas à faire démarrer ce fichu timer au chargement de la page.
Sur le page_load j'essai de faire Timer1.start() mais il ne comprends pas.
Peux tu m'aider STP
Merci d'avance
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 8 déc. 2008 à 11:03
Le timer devrait démarrer tout seul. Lorsque tu tapes quelque chose (n'importe quoi) dans le textbox, rien ne s'affiche dans le label ?
Et est-ce que le bouton, avec l'heure, marche ?
Sinon, as-tu une erreur ? Assure toi aussi que ton navigateur autorise les scripts javascript.
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008 8 déc. 2008 à 11:14
Le bouton avec l'heure fonctionne bien mais pas le timer
Autrement, je suis sur IE 7 et il me semble que les scripts javascript sont autorisés.
Par conte j'ai un done with error au chargement de la page
ggtry
Messages postés417Date d'inscriptionvendredi 13 juin 2008StatutMembreDernière intervention21 juillet 20101 8 déc. 2008 à 11:56
Je ne sais pas : l'exemple que je t'ai donné marche sans erreur chez moi.
Active le débogage des scripts sur IE7 (dans Options, Avancé, Navigation, décocher Désactiver le débogage des scripts (IE7)) et regarde ce qui se passe...
cs_Augustus
Messages postés13Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention 8 décembre 2008 8 déc. 2008 à 12:11
J'ai fait ce que tu m'as dit et il me plante sur :
</
asp:UpdatePanel>Là j'ai du mal à comprendre. tu utilises quel composant ajax et tu es sur quelle version de visual studio ( moi visual studio 2005, C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\v1.0.61025\AJAXExtensionsToolbox.dll)