Récupérer une variable client coté serveur sans postback

Résolu
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 8 décembre 2008 - 4 déc. 2008 à 12:15
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre 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]

13 réponses

cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 8 décembre 2008
8 déc. 2008 à 13:33
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]
3
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
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...

GGtry
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Derniè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...

[mailto:M@le M@le]
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
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.

<%@ 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Derniè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

[mailto:M@le M@le]
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 8 décembre 2008
8 déc. 2008 à 10:01
Autant pour moi, c'était une question idiote

[mailto:M@le M@le]
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
8 déc. 2008 à 10:04
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
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Derniè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

[mailto:M@le M@le]
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
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.

GGtry
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Derniè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

[mailto:M@le M@le]
0
ggtry Messages postés 417 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 21 juillet 2010 1
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...

GGtry
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Derniè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)

[mailto:M@le M@le]
0
cs_Augustus Messages postés 13 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 8 décembre 2008
8 déc. 2008 à 12:18
Sys is undefined

[mailto:M@le M@le]
0
Rejoignez-nous