Récupérer une variable client coté serveur sans postback [Résolu]

Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
- - Dernière réponse : cs_Augustus
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Derniè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

voici mon code :

Chat.aspx

<%

@
Page
Language="VB"
AutoEventWireup="false"
CodeFile="Chat.aspx.vb"
Inherits="Chat" %>
<!

DOCTYPE
html
PUBLIC
"-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><

html
xmlns="http://www.w3.org/1999/xhtml"
><

head
runat="server">

<title>Page sans titre
</title>

<script
type="text/javascript">

var interval =
"";

var i = 5;

function startTimer(){

interval = window.setInterval(

"tTimer()",1000);}

function stopTimer(){

window.clearInterval (interval);

interval=

"";}

function tTimer(){

CallServer(

'Text',
'');}

function ReceiveServerData(arg, context){

document.getElementById(

'Label1').innerText = arg;}

</script>

</

head><

body
onload="startTimer();"
>

<form
id="form1"
runat="server">

<div>

<asp:Label
ID="Label1"
runat="server"
Height="416px"
Text=""
Width="552px"></asp:Label>&nbsp;<br
/>

<br
/>

<asp:TextBox
ID="TextBox1"
runat="server"
AutoPostBack="True"></asp:TextBox>

<input
id="Button1"
type="button"
value="Envoyer"
onclick="CallServer('Text','')"
/>

</div>

</form></

body></

html>

Chat.aspx.vb

Partial

Class Chat

Inherits System.Web.UI.Page

Implements ICallbackEventHandler

Private _callbackArg
As
String

Protected
Sub Page_Load(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles
Me.Load

Dim cbReference
As
String

Dim callbackScript
As
String

Dim cm As ClientScriptManager Page.ClientScriptcbReference cm.GetCallbackEventReference(

Me,
"arg",
"ReceiveServerData",
"context")callbackScript =

"function CallServer(arg, context){" & cbReference &
"; }"cm.RegisterClientScriptBlock(

Me.GetType(),
"CallServer", callbackScript,
True)

If IsPostBack =
False
ThenApplication(

"MonTexte") =
""

End
If

End
Sub

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

Select
Case _callbackArg

Case
"time"

Return
My.Computer.Clock.LocalTime.ToString()

Case
"mem"

Return (
My.Computer.Info.AvailablePhysicalMemory / 1024).ToString() &
"K"

Case
"Text"

Return (Application(
"MonTexte"))

Case
Else

Return _callbackArg

End
Select

End
Function

Protected
Sub TextBox1_TextChanged(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles TextBox1.TextChangedApplication(

"MonTexte") = Application(
"MonTexte") & TextBox1.Text & vbCrLfTextBox1.Text =

""

End
SubEnd

Class

[mailto:M@le M@le]
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
3
Merci
Problème résolu

Il faut ajouter ce code dans le WebConfig

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
      ...
    </httpHandlers>
    ...
  </system.web>
  ...
</configuration>

[mailto:M@le M@le]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_Augustus
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Dernière intervention
21 juillet 2010
0
Merci
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...

GGtry
Commenter la réponse de ggtry
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
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...

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Dernière intervention
21 juillet 2010
0
Merci
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.

<%@ Page Language="VB" %>
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    Namespace="System.Web.UI" TagPrefix="asp" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<script runat="server">


    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>


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Page sans titre</title>
</head>

    <form id="form1" runat="server">
   
   
       
       
     
        <ContentTemplate>
            Texte :
           
           

            Heure :
           
         </ContentTemplate>
         <Triggers>
           
           
         </Triggers>
      
       
       
        
       
       

    </form>

</html>

GGtry
Commenter la réponse de ggtry
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
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

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
Autant pour moi, c'était une question idiote

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Dernière intervention
21 juillet 2010
0
Merci
Bonjour,

Je n'ai pas fait attention en faisant mon copier/coller. Mais il s'agit simplement des adresses habituelles que tu as dans la balise doctype et la balise html quant tu crées une page asp.
C'est donc 1/ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
et 2/ http://www.w3.org/1999/xhtml

GGtry
Commenter la réponse de ggtry
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
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

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Dernière intervention
21 juillet 2010
0
Merci
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.

GGtry
Commenter la réponse de ggtry
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
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

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
417
Date d'inscription
vendredi 13 juin 2008
Dernière intervention
21 juillet 2010
0
Merci
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...

GGtry
Commenter la réponse de ggtry
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
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)

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus
Messages postés
13
Date d'inscription
mercredi 11 octobre 2006
Dernière intervention
8 décembre 2008
0
Merci
Sys is undefined

[mailto:M@le M@le]
Commenter la réponse de cs_Augustus

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.