IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[vb.net] probleme de datasource perdu apres le postback


Sujet :

ASP.NET

  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut [vb.net] probleme de datasource perdu apres le postback
    BOnjour,
    Au premier chargement de ma page je récupere mes données dans un dataset et je bind mon datagrid.

    SI il y a Postback, alors je ne refais pas cette opération. Malheureusement je ne peux plus accéder a mon dataset car il ne vaut plus rien (normal)
    Quelle est la technique en asp.net pour conserver ce dataset ? (j'imagine pas utiliser une variable de session pour ca....)

    merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Une solution est de sauver ton objet en session ou en application (ça depend s'il y a un dataset différent pour chaque utilistauer ou pas).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Dans le viewstate....

  4. #4
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Merci pour ta réponse mais je reste sur ma faim
    En effet, le postback est déclenché par le click sur un linkbutton. J'ai un event handler sur le click qui redirige l'utilisateur en fonction de parametres contenues dans le dataset.
    Or, avant que l'event handler soit appellé, le postback est effectué et donc je perds mes données dans mon dataset.
    Je ne peux pas croire qu'il faille passer par une variable de Session ou meme d'Application, a chaque fois que l'on fait un postback ! Ou alors asp.net est vraiment mal fichu

    EDIT
    ha merci SuperB, on a posté en meme temps , je regarde ca alors

  5. #5
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Impeccable, j'ai sérialisé le dataset vers un 'objet' viewstate (désolé je ne connais pas les termes exacts):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ViewState("myDataSource") = myDatatable.
    Juste une question: quand est ce que le garbage collector se débarasse de cet objet ViewState ?

    merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    Ven en fait .net sérialise ton objet et le met dans un champ caché de la page ( nommé __VIEWSTATE). Donc pas besoin de se préoccuper du garbage collector ou autre... c sur le postback que .Net récupère les données et désérialisent les données...

    C'est sympa. Cependant attention ta page peut vite devenir grosse si abus du view state

  7. #7
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    ok. merci !

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Or, avant que l'event handler soit appellé, le postback est effectué et donc je perds mes données dans mon dataset.
    Je ne peux pas croire qu'il faille passer par une variable de Session ou meme d'Application, a chaque fois que l'on fait un postback ! Ou alors asp.net est vraiment mal fichu
    Mais enfin c'est pas .Net qui est mal fichu, c'est le modele d'application Web. Tu as d'un coté le client de l'autre le serveur, les deux communiquent eh HTTP qui est un protocole déconnecté. Autrement dit pas moyen pour ton serveur de savoir qd un utilisateur s'est déconnecté de ton appli et donc il ne peut pas garder en mémoire des pages en supposant que l'utilisateur va revenir dessus. Conséquence : les variables que tu déclares et utilises dans tes pages ne sont conservées en mémoire que le temps de l'exécution de la requete du client c'est tout. Si tu veux persister des données d'un appel à l'autre il faut mettre ces données qque part, asp.net (comme n'importe quel autre framework web) te propose la session, l'application ou le viewstate ça c'est spécifique asp.net, mais aprés tout ce n'est qu'un champ caché). Bien entendu tu peux toujours mettre ça ailleurs, genre dans un fichier ou je ne sais ou, mais à toi de gérer ça manuellement.

    Pour une table, bien sur tout depend de sa taille, franchement le viewstate est un peu a déconseiller vu qu'il est envoyé coté client puis le client le renvoie au serveur à chaque postback. A l'origine ce viewstate sert surtout a conserver l'etat des controles d'un postback à l'autre, si ta page n'est pas trés lourde tu peux y ajouter des infos mais plutot legeres (des chaines de caractère, un entier etc...) car sinon vive la lenteur de tes pages et vive la consommation de bande passante. Si ta table est importante tu gagneras surement autant à refaire ta requete sur ta base, sauf evidemment si tu es plus limité en accés base de données qu'en bande passante (mais ya un impacte pour le client qd meme...).

  9. #9
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    En effet. Cependant mon datatable est tres légé pour le coup, il n'y aura jamais plus d'une dizaine d'enregistrements. Toi tu me conseillerais plutot la variable de Session alors ? Ce qui m'ennuie avec ca c'est a quel moment désallouer la mémoire, pas envie quel dure jusqu'a la fin de la session pour ca...

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Si ta table est vraiment petite pourquoi pas, mais je te conseille qd meme de regarder le résultat de la serialisation d'un DataSet, il doit surement embarquer un tas d'infos qui font que cette sérialisation est bien plus grosse que la somme de tes données utiles.

    Bon cela dit mon conseil etait d'ordre général, un DataSet dans le viewSate ça sonne pas bien, la session (ou l'application) est à conseiller, mais ya toujours des cas particuliers, des contraintes particulieres. A toi de trancher.

    PS : si la données est mise en session pas moyen de libérer sa mémoire avant la fin de la session pour le garbage collector.

  11. #11
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Points : 1 022
    Points
    1 022
    Par défaut
    Citation Envoyé par Sphax
    PS : si la données est mise en session pas moyen de libérer sa mémoire avant la fin de la session pour le garbage collector.
    Voila C'est ca que je trouve extraordinaire ,
    Et l'objet mettre en cache un dataset vous en en pensez quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cache("myDataset") = myDataset

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Voila C'est ca que je trouve extraordinaire
    Pas tant que ça. Deux choses ici : le garbage collector ne peut reclamer la mémoire d'un objet que si celui ci n'est plus référencé. Donc normal qu'il ne puisse pas récupérer la mémoire d'un objet en session tant que la session est active.
    Ensuite la session est un truc pour ce probleme de mode déconnecté du web, en gros on simule le fait que l'utilisateur est toujours présent su l'appli en disant que bon a partir du moment ou l'utilisateur fait une action on va supposer qu'il sera encore la dans 5, 10 ou 20 minutes (le timeout de session). Ce qui permet justement de conserver l'etat de certaines variables plutot que de les recréer à chaque postback.

    Solution si t'es pas content de ça : diminuer le timeout de session. Mais bon tu te retrouves avec d'autres soucis...

    On y revient, le probleme c'est le web, c'est déconnecté, tout consiste à contourner ça et de bien équilibrer l'utilisation des ressources coté serveur.

    Le cache est comun a tte l'application il me semble (pas comme la session). Donc ton objet sera en mémoire tte la vie de l'appli (corrigez moi si je me trompe). Ton soucis est inextricable, il n'y a pas de solution parfaite

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 68
    Points : 80
    Points
    80
    Par défaut
    ben si ça peut t'aider

    moi je stocke un id qui récupère l'objet dans la session (dès que l'objet est lu dans la session il est supprimé... bo après faut intégrer le truc koa)
    essai d'adapter ça... voilà la classe que je me suis faite et que j'utilise... si t'arrives à comprendre ce que j'ai essayer de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
     
    using System;
    using System.Collections;
    using System.Web.SessionState;
     
    namespace MonProjet.GestTemp
    {
    	/// <summary>
    	/// Description résumée de StockageTemporaire Par SuperB
    	/// </summary>
    	public class StockageTemporaire
    	{
    		#region Constantes
     
    		/// <summary>
    		/// Nom du préfixe de clé en session
    		/// </summary>
    		private const string NOM_CLE_SESSION		= "STOCTEMPOBJID";
     
    		#endregion
     
    		#region Partie instanciable
     
    		#region Attributs
     
    		/// <summary>
    		/// Déclaration de l'attribut représentant l'objet stocké temporaire
    		/// </summary>
    		private Object _objStocke;
     
    		/// <summary>
    		/// Déclaration de l'attribut représentant la date de stockage de l'objet
    		/// </summary>
    		private DateTime _dateStockage;
     
    		#endregion
     
    		#region Constructeurs
     
    		/// <summary>
    		/// Constructeur sans argument
    		/// </summary>
    		public StockageTemporaire() : this(null)
    		{
    		}
     
    		/// <summary>
    		/// Constructeur avec argument
    		/// </summary>
    		/// <param name="aObj">Objet à stocker</param>
    		public StockageTemporaire(Object aObj)
    		{
    			this.ObjetStocke = aObj;
    			this.DateStockage = DateTime.Now;
    		}
     
    		#endregion
     
    		#region Assesseurs de gestion
     
    		/// <summary>
    		/// Assesseur de gestion de l'objet stocké temporairement
    		/// </summary>
    		public Object ObjetStocke
    		{
    			get
    			{
    				return this._objStocke;
    			}
    			set
    			{
    				this._objStocke = value;
    			}
    		}
     
    		/// <summary>
    		/// Assesseur de gestion de la date de stockage de l'objet
    		/// </summary>
    		public DateTime DateStockage
    		{
    			get
    			{
    				return this._dateStockage;
    			}
    			set
    			{
    				this._dateStockage = value;
    			}
    		}
     
    		#endregion
     
    		#endregion
     
    		#region Partie Statique
     
    		/// <summary>
    		/// Fonction pour stocker temporairement un objet
    		/// </summary>
    		/// <param name="aObj">Objet à stocker temporairement</param>
    		/// <returns>Retourne l'identifiant à utiliser pour retourner l'objet</returns>
    		public static int addObject(HttpSessionState Session, Object aObj)
    		{
    			//Création de l'objet stockage
    			StockageTemporaire oTemp = new StockageTemporaire(aObj);
     
    			//Calcul de la clé de stockage :
    			int cle = 0; 
     
    			if(Session != null)
    			{
    				//Calcul de la clé
    				for(int i=0; i<Session.Keys.Count; i++)
    					if(Session.Keys[i].StartsWith(NOM_CLE_SESSION))
    						if(NOM_CLE_SESSION.Length < Session.Keys[i].Length)
    						{
    							//Récupération de la clé
    							String vlCle = Session.Keys[i].Substring(NOM_CLE_SESSION.Length);
    							int idCleTemp = 0;
    							try
    							{
    								idCleTemp = int.Parse(vlCle);
    							}
    							catch
    							{
    								idCleTemp = 0;
    							}
    							//Test du maximum
    							if(idCleTemp > cle)
    								cle = idCleTemp;
    						}
     
    				//Incrémentation de la clé (puisque maximum)
    				cle++;
     
    				//Nom :
    				String nomCle = String.Concat(NOM_CLE_SESSION, cle.ToString());
     
    				//Stockage
    				Session.Add(nomCle, oTemp);				
    			}
     
    			return cle;
    		}
     
    		/// <summary>
    		/// Fonction pour récupérer un objet péalablement supprimé et le déstocke
    		/// </summary>
    		/// <param name="aCle">Identifiant de l'objet à récupérer</param>
    		/// <returns>Retourne l'instance de stockage temporaire contenant l'objet désiré</returns>
    		public static StockageTemporaire getObject(HttpSessionState Session, int aCle)
    		{
    			//Déclaration de l'objet de retour
    			StockageTemporaire objRetour = new StockageTemporaire();
     
    			if(Session != null)
    				if(aCle > 0)
    				{
    					try
    					{
    						//Calcul du nom de la clé en session
    						String nomCle = String.Concat(NOM_CLE_SESSION, aCle.ToString());
     
    						//Récupération
    						objRetour = (StockageTemporaire)Session[nomCle];
     
    						//Suppression en session
    						Session.Remove(nomCle);
    					}
    					catch
    					{
    						//On ne fait rien
    					}
    				}
     
    			//Retour de l'objet
    			return objRetour;
    		}
     
    		#endregion
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Datepicker perdu après un postback
    Par daydream123 dans le forum jQuery
    Réponses: 5
    Dernier message: 23/01/2015, 15h40
  2. données perdues après la fermeture vb net
    Par tiny23 dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/02/2011, 10h01
  3. [VS.NET] Probleme d'ancrage
    Par krachunka dans le forum Visual Studio
    Réponses: 2
    Dernier message: 22/04/2004, 14h09
  4. [VB.Net] Probleme avec dialogues (confirm et alert)
    Par crackity_jones666 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 26/11/2003, 22h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo