begin process at 2012 05 27 06:12:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ASP.Net

 > COMMENT CONSERVER L'ÉTAT D'UNE VARIABLE (SESSION ET VIEWSTATE)

COMMENT CONSERVER L'ÉTAT D'UNE VARIABLE (SESSION ET VIEWSTATE)


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :ASP.Net Source .NET ( DotNet ) Classé sous :viewstate, variable, session, etat, application Niveau :Débutant Date de création :24/07/2004 Vu :20 310

Auteur : jesusonline

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

Sur le forum, j'ai vu à plusieurs reprises que certaines personnes ne comprenait pas pourquoi, leur variable disparaissait.

En effet, ils avaient saisi ce code :

    Private maVariable As Integer

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        maVariable += 1
        Response.Write(maVariable)
    End Sub

    Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
        maVariable += 2
        Response.Write(maVariable)
    End Sub

et quand il cliquait une première fois sur un bouton, le nombre correspondant apparaissait mais par contre, lorsqu'il recliquait dessus, les nombres ne s'ajoutaient pas.
Par exemple, on clique le bouton 2, ca affiche 2 puis on click sur le bouton 1 ça affiche 1 alors que l'on s'attendait à 3 (maVariable += 1)

Le problème vient que les applications webform sont en mode deconnecté, donc quand l'utilisateur fait le postback (le deuxième click sur le bouton) il commence au début donc mavariable vaut 0

Il existe deux solutions à ce problème

Le ViewState :

au lieu d'ecrire Private maVariable As Integer ecrivez :
    Private Property maVariable() As Integer
        Get
            Return CType(viewstate("MaVariable"), Integer)
        End Get
        Set(ByVal Value As Integer)
            viewstate("MaVariable") = Value
        End Set
    End Property

Ce code est un peu plus long, mais aux deuxieme click sur le bouton, la page affichera 3 !
Grace à cette méthode, asp.net va ecrire de facon codé la variable à l'interieur d'un champ caché :
<input type="hidden" name="__VIEWSTATE" value="dDwtNTMwNzcxMzI0O3Q8cDxsPE1hVmFyagUAyRfkR" />
Ainsi une fois le postback effectué asp.net saura la valeur de maVariable

Mais cette méthode a deux inconvénients :
Le premier c'est que le champ caché alourdit considérablement le poids de la page, mais avec les connexions de plus en plus rapide, c'est de moins en moins un problème. Mais le deuxième inconvénient c'est que le viewstate n'accepte pas tous les objets, il n'accepte que les objets serializable, et ce n'est pas le cas de tous les objets, par exemple le code suivant n'est pas valide :
        Dim oTable As New HtmlTable
        Viewstate("oTable ") = oTable
Asp.net nous renverra ce message d'erreur :
Le type 'System.Web.UI.HtmlControls.HtmlTable' doit être marqué comme Serializable ou utiliser un TypeConverter autre que ReferenceConverter dans le viewstate.  

L'Autre méthode qui permet de résoudre ce dernier problème est les sessions: il suffit de modifier le code comme ceci :
    Private Property maVariable() As Integer
        Get
            Return CType(session("MaVariable"), Integer)
        End Get
        Set(ByVal Value As Integer)
            session("MaVariable") = Value
        End Set
    End Property

Ce code fonctionnera avec tous les objets possibles et imaginables, le seul petit problème, c'est que la variable est stockée sur le serveur, d'ou une surcharge de travail.

Source

  • 'viewstate :
  • Private Property maVariable() As Integer
  • Get
  • Return CType(viewstate("MaVariable"), Integer)
  • End Get
  • Set(ByVal Value As Integer)
  • viewstate("MaVariable") = Value
  • End Set
  • End Property
  • 'Session :
  • Private Property maVariable() As Integer
  • Get
  • Return CType(session("MaVariable"), Integer)
  • End Get
  • Set(ByVal Value As Integer)
  • session("MaVariable") = Value
  • End Set
  • End Property
'viewstate : 

    Private Property maVariable() As Integer
        Get
            Return CType(viewstate("MaVariable"), Integer)
        End Get
        Set(ByVal Value As Integer)
            viewstate("MaVariable") = Value
        End Set
    End Property


'Session : 

    Private Property maVariable() As Integer
        Get
            Return CType(session("MaVariable"), Integer)
        End Get
        Set(ByVal Value As Integer)
            session("MaVariable") = Value
        End Set
    End Property

 Conclusion

si vous avez des remarques sur cette explication n'hésitez pas :)


 Sources du même auteur

Source avec Zip Source .NET (Dotnet) UTILISATION DE LA MÉTHODE SORT ET SORTDIRECTION AVEC UN GRID...
Source .NET (Dotnet) RESPONSE.FILTER : MANIPULATION DU STREAM DE SORTIE ASP.NET
Source avec Zip Source .NET (Dotnet) OPTIMISATION DE LA SERIALISATION JSON POUR LES LIST<T>
Source avec Zip Source .NET (Dotnet) CRAWLABLELINKBUTTON : UPDATEPANEL ET RÉFÉRENCEMENT
Source .NET (Dotnet) POSTBACKCONTROL - COMMUNICATION CLIENT/SERVEUR AVEC LES UPDA...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) GUESTBOOK AVEC GRIDVIEW par DanMor498
Source avec Zip CHECKED DROPDOWNLIST par fredzool
Source avec Zip Source avec une capture Source .NET (Dotnet) GRIDVIEW WITH TREEVIEW AND CALLBACK par fredzool
Source avec Zip APPELLER UN WEBSERVICE DEPUIS JAVASCRIPT par fredzool
Source avec Zip Source .NET (Dotnet) MONEY TEXTBOX WITH EMBEDED JAVASCRIPT par fredzool

 Sources en rapport avec celle ci

Source .NET (Dotnet) STOCKER LE VIEWSTATE SUR LE SERVEUR PLUTÔT QUE LE CLIENT par jesusonline
Source .NET (Dotnet) ATTENTION PROBLÈME DE DEFAULTVIEW DE DATATABLE par Coolpix08
Source .NET (Dotnet) METTRE EN CACHE SUIVANT UN PARAMÈTRE PERSONALISÉ par jesusonline
Source avec Zip AUTHENTIFICATION D'UTILISATEURS AVEC BASE DE DONNÉES par Nurgle
COMPTEUR DE VISITE AVEC VARIABLE DE SESSION par tidave

Commentaires et avis

Commentaire de arcollet le 27/07/2004 00:38:09

Bonjour,

J'ai une petite question toute bête qui me tracasse :

Y a til un gain (performance, autre) à écrire :

"Return CType(session("MaVariable"), Integer)"

plutôt que

Return session("MaVariable")

Merci

Denis

Commentaire de jesusonline le 26/08/2004 13:52:18 administrateur CS

oui d'ecrire CType(session("MaVariable"), Integer) sert a qqchose, dans le cas d'un integer la conversion sera fait implicitement pas Visual Basic, mais ce n'est pas le cas de
C# et la deuxieme raison, est que si tu as un objet complexe au lieu d'un integer, VB ne te feras pas la conversion implicitement

Commentaire de maximemonny le 11/05/2005 15:21:58

Et déclarer des varaibles publiques dans un module créé spécialement pour ? C'est pas plus simple?

Commentaire de TOTOCHITO le 23/04/2007 10:08:23

j'ai une petite question j'ai une page aspx contenu dans un content place holder, et je souhaiterais sauver 2 valeurs de listbox afin de filtrer un gridview. Sur l'évènement click d'un bouton j'ai donc pour sauvegarder mes 2 variables :
Me.ViewState("mavariable") = lst_gamme.Text
Me.ViewState("mavariable2") = lst_produit.Text

le probleme est qu'il repasse par le load de la page avant d'executer le code de l'évènement click et donc retour a la case départ, puisque les variables sélectionnées, ne sont plus la.

Pourquoi le code n'execute pas l'évenement du bouton avant de recharger la page ?
Aurais tu une idée ?

Commentaire de jesusonline le 23/04/2007 10:54:37 administrateur CS

Bonjour,

ASP.net s'execute coté serveur, lorsque tu fais une requete HTTP, ASP.net n'a "aucun" moyen de savoir si c'est ta premiere requete ou non, pour cela il refait entierement le cycle de vie de la page, c'est donc tout à fait normal qu'il passe par le page_load. Pour savoir si ta requete via d'une action de l'utilisateur (postback) tu as la propriété Page.IsPostBack qui te retourne true lors d'un postback, par exemple lors d'un click sur un bouton.

Commentaire de TOTOCHITO le 23/04/2007 11:28:58

Oui en effet tu as entièrement raison
Mais mon probleme en fait ne vient pas de la, lorsque sur l'évenement d'un bouton click je veux récupérer les valeurs d'un listbox lié à une source (sqldatasource), je peux récupérer sa valeur sélectionnée dans l'evenement click, en revanche, lorsque cette liste est charger par un datareader dynamiquement dans une fonction, les données ne persistent plus et les listes se vident.
as tu déja eu ce probleme ?

Commentaire de balbicio le 15/11/2007 13:13:17

Bonjour,

Est ce que la solution basée sur les ViewStates est valable dans le cas d'un objet de type DataSet?
Egalement qui est la meilleur solution dans ce cas? les ViewStates ou bien l'objet Session ??

Merci

Commentaire de jesusonline le 15/11/2007 23:48:06 administrateur CS

Sérializer un DataSet dans un viewstate ? Mouais ca doit être possible mais ca va etre super lourd ! donc autant le mettre dans la session.

Commentaire de arcollet le 16/11/2007 09:58:47

Bonjour,
Ok tu as exposé 2 méthodes (viewstate et session), j'utilise personnellement la session mais comme tu le précises c'est parfois pénible surtout si l'application est truffée de variables de session, ce qui est mon cas. Il y a une 3ème méthode, celle qui utilise SQL Server pour y stocker les variables de session, mais j'ai des difficulté à la mettre en place. Peux tu m'aider ?
Merci
Denis

Commentaire de snopims le 12/11/2008 23:49:45

Perso j'utilise plutot un champs caché.
Car si tu programme un composant avec ta méthode.
Et si dans ta page tu utilises 2 fois le composant, n'y a t'il pas un problème de conflit (Les deux instances sur la même variable) ?
On peut sans doute éviter cela en préfixant les variables avec l'id de l'instance du composant.

Commentaire de jmclej le 28/04/2009 12:53:46

Bonjour,
En rapport avec cet article, est-ce que vous savez comment accéder du côté client, en javascript donc, à une variable que l'on aura placé dans le viewstate ou en session, après de multiples postback?
D'avance merci,
Julien

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Variable de Session entre 2 applications IIS [ par sispeo ] BonjourJ'essaye depuis un bout de temps à utiliser mes variables de session d'une application à une autre, mais cela ne fonctionne pas.En fait j'ai un Variable session ou application [ par Byrong ] Bonjour voila j'ai une question relativement importante. Je fais un site de recherche avec des critères de recherche tapées par l'utilisateur. Si j Problème d'affichage [ par Byrong ] Bonjour voila j'ai une petite application qui permet de consulter les noms de personnes étant dans un dossier spécifique. J'ai mi l'application sur laisser en mémoire une application pendant toute la durée d'une session [ par furet123302 ] Bonjour, Je suis à la recherche d'une méthode pour laisser un .exe en mémoire pendant toute la durée d'une session. Savez-vous comment je pourrais r Déclencher évènement automatiquement au bon moment [ par SaiYan5102 ] Bonjour, J'ai créé deux pages aspx. L'une est une image (créée en C#). L'autre est une page web qui contient cette image. Là où ça coince c'est que d Objet session [ par Byrong ] Bonjour j ai une petite question. J'ai un site qui aura plusieurs utilisateurs. Est ce que les variable propre a mes fonctions doivent etre en varia variable session d'un autre utilisateur [ par hudon77 ] Bonjour, j'utilise des variable session sur ma page d'accueil. Lorsqu'il y a beaucoup d'achalandage en meme temps il arrive qu'un usager arrive sur le Croisement varibale session C# [ par porban ] Bonjour, j'ai un gros problème avec l'utilisation de variable de session. J'ai un site qui permet de gérer des clients. Je me logue, si je suis ident exeption NullReferenceException [ par melda ] Bonjour,J'aurais besoin d'une aide, après toutes mes recherches infructueuses d'autant plus que je ne sais toujours pas comment utiliser la msdn ;( Je Problème d'application d'une culture pour la MasterPage [ par ptitkosmos ] Bonjour,je suis entrain de développer un website en asp.net (vb) qui doit pouvoir gérer plusieurs langues (définie par l'utilisateur connecté). J'ai r


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,732 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales