Accueil > > > STOCKER LE VIEWSTATE SUR LE SERVEUR PLUTÔT QUE LE CLIENT
STOCKER LE VIEWSTATE SUR LE SERVEUR PLUTÔT QUE LE CLIENT
Information sur la source
Description
Par défaut ASP.net stocke le viewstate dans un champ caché du formulaire coté client, ce bout de code permet d'enregistrer cette valeur côté serveur dans une propriété static. Attention si l'application redemarre le viewstate sera alors perdu, j'ai posté ce code seulement pour montrer le concept, mais en production si vous avez vraiment besoin de stocker le viewstate sur le serveur plutot que le client (ce qui est très rare) il est conseille de l'enregistrer dans une base de donnée ou tout autre espace de stockage persistant. De plus comme je supprime le viewstate de la collection l'utilisateur risque de rencontrer des problèmes s'il joue avec le bouton retour et refait la même requête. La source récupere la valeur non sérializé du viewstate le stock sur le serveur avec un identifiant unique et écrit dans un champ caché seulement cet identifiant unique. UPDATE : ASP.net fait ce comportement nativement avec le SessionPageStatePersister : http://msdn2.microsoft.com/en-us/library/system.we b.ui.sessionpagestatepersister.aspx
Source
- using System;
- using System.Data;
- using System.Configuration;
- using System.Collections;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Collections.Generic;
-
- /// <summary>
- /// This class save the viewstate value of each request on the WebServer.
- /// Don't use this on a server production ! If the application restart all the viewstates
- /// information will be loosed. You should save the viewstate in a DataBase or in any persistent storage.
- /// </summary>
- public class ServerViewStatePage : Page
- {
- private static Object _lock = new object();
- private static Dictionary<Guid, Object> __viewstates;
- /// <summary>
- /// Gets a dictionnary of viewstates stocked in the server.
- /// </summary>
- /// <value>The dictionary of viewstate stocked in the server.</value>
- private static Dictionary<Guid, Object> _viewstates
- {
- get
- {
- lock (_lock)
- {
- if (__viewstates == null)
- __viewstates = new Dictionary<Guid, Object>();
- }
- return __viewstates;
- }
- }
-
- /// <summary>
- /// Loads any saved view-state information to the <see cref="T:System.Web.UI.Page"></see> object.
- /// </summary>
- /// <returns>The saved view state.</returns>
- /// <remarks>Try to get the original viewstate if the __VIEWSTATEID hidden field was posted</remarks>
- protected override object LoadPageStateFromPersistenceMedium()
- {
- if (!String.IsNullOrEmpty(Request.Form["__VIEWSTATEID"]))
- {
- Guid viewstateID = Guid.Empty;
- try
- {
- viewstateID = new Guid(Request.Form["__VIEWSTATEID"]);
- }
- catch
- {
- return null;
- }
- Object viewstate;
- if (_viewstates.TryGetValue(viewstateID, out viewstate))
- _viewstates.Remove(viewstateID); // Be carefull we remove the Viewstate so the user won't be able to make again the same request
-
- return viewstate;
- }
- else
- {
- return null;
- }
- }
-
- /// <summary>
- /// Saves any view-state and control-state information for the page into a server Object.
- /// </summary>
- /// <param name="state">An <see cref="T:System.Object"></see> in which to store the view-state information.</param>
- protected override void SavePageStateToPersistenceMedium(object state)
- {
- Guid viewstateID = Guid.NewGuid();
- _viewstates.Add(viewstateID, state);
- this.ClientScript.RegisterHiddenField("__VIEWSTATEID", viewstateID.ToString("N"));
- }
-
- }
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Generic;
/// <summary>
/// This class save the viewstate value of each request on the WebServer.
/// Don't use this on a server production ! If the application restart all the viewstates
/// information will be loosed. You should save the viewstate in a DataBase or in any persistent storage.
/// </summary>
public class ServerViewStatePage : Page
{
private static Object _lock = new object();
private static Dictionary<Guid, Object> __viewstates;
/// <summary>
/// Gets a dictionnary of viewstates stocked in the server.
/// </summary>
/// <value>The dictionary of viewstate stocked in the server.</value>
private static Dictionary<Guid, Object> _viewstates
{
get
{
lock (_lock)
{
if (__viewstates == null)
__viewstates = new Dictionary<Guid, Object>();
}
return __viewstates;
}
}
/// <summary>
/// Loads any saved view-state information to the <see cref="T:System.Web.UI.Page"></see> object.
/// </summary>
/// <returns>The saved view state.</returns>
/// <remarks>Try to get the original viewstate if the __VIEWSTATEID hidden field was posted</remarks>
protected override object LoadPageStateFromPersistenceMedium()
{
if (!String.IsNullOrEmpty(Request.Form["__VIEWSTATEID"]))
{
Guid viewstateID = Guid.Empty;
try
{
viewstateID = new Guid(Request.Form["__VIEWSTATEID"]);
}
catch
{
return null;
}
Object viewstate;
if (_viewstates.TryGetValue(viewstateID, out viewstate))
_viewstates.Remove(viewstateID); // Be carefull we remove the Viewstate so the user won't be able to make again the same request
return viewstate;
}
else
{
return null;
}
}
/// <summary>
/// Saves any view-state and control-state information for the page into a server Object.
/// </summary>
/// <param name="state">An <see cref="T:System.Object"></see> in which to store the view-state information.</param>
protected override void SavePageStateToPersistenceMedium(object state)
{
Guid viewstateID = Guid.NewGuid();
_viewstates.Add(viewstateID, state);
this.ClientScript.RegisterHiddenField("__VIEWSTATEID", viewstateID.ToString("N"));
}
}
Conclusion
Il suffit de mettre ce code dans le repertoire App_Code et de dériver votre page de Server ViewstatePage plutot que System.Web.UI.Page
Historique
- 25 novembre 2006 16:39:28 :
- Rajout d'un lock dans le cas où 2 threads tente en même temps d'accéder a _viewstates alors que __viewstates est null (merci Richard ;) ==> http://blogs.developpeur.org/cyril/archive/2006/11/25/enregistrer-la-viewstate-sur-le-serveur.aspx)
- 25 novembre 2006 17:38:30 :
- Nouvelle remarque
- 26 décembre 2007 13:54:39 :
- PageStatePersister : http://msdn2.microsoft.com/en-us/library/system.web.ui.sessionpagestatepersister.aspx
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
afficher Image sur un datagrid suivant champ de données ? [ par coulis ]
Voici mon problème : (je travaille avec VS) Je veux afficher dans un « datagrid » une colonne avec des images. Mais ce
afficher dans une colonne « datagrid » 2 champs de données ? [ par coulis ]
Voici mon problème : (je travaille avec VS) Je veux afficher dans une colonne « datagrid » 2 champs de données 
Problème du au Viewstate ??? [ par stp_7 ]
Salut,J'ai crée un Custom web control (un time picker avec une dropdown list pour les heures et le minutes).Cet objet me sert à l'encodage d
problème dropdownlist [ par lenneth666 ]
Voila alors j 'ai une datagrid. Dan sune colonne je veut que lorsque l'on passe en mode édition, un label laisse place a une dropdownlist.Et qd j
Problème "Échec du chargement de viewstate" [ par jeremaub ]
Voilà mon souci: j'ai une page avec 2 textbox un bouton et un datagrid lorsque je clique sur le bouton j'execute une requete qui prend dans sa
controls ajoutés dynamiquement [ par DeitY51 ]
Bonjour, if (!IsPostBack){ // cree les datagrid dynamiquement CreerListeDemande(); // cree les panels contenant les datagrid CreerPanelsDemande()
ViewState dans controles imbriqués [ par benjiiim94 ]
Bonjour, J'utilise un controle datagrid dans un controle repeater. Lors d'une publication, les données de mon datagrid ne sont pas actualisé
DataGrid et ViewState [ par benjiiim94 ]
Bonjour, J'ai un problème pour créer un datagrid qui utilise le viewstate, plus précisemment ce problème l'événement o
utiliser viewstate [ par emna_bz ]
Bonjour Je travail avec asp.net et c#.J'ai besoin d'utiliser viewstate .Je vais vous expliquer mon probleme:*j'ai un champ text et un boutton si on cl
Désactiver la vérification du viewstate [ par Coolpix08 ]
Voila pour rediriger mes variables vers une autre frame et sur une autre page aspx j'utilise un bouton submit HTML qui modifie, en javascript la frame
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
GRIDVIEW CHECKBOXGRIDVIEW CHECKBOX par invent001
Cliquez pour lire la suite par invent001 OUTIL MYSQLOUTIL MYSQL par nobla
Cliquez pour lire la suite par nobla
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|