2010-05-21 4 views
37

Quelqu'un peut-il expliquer la différence entre ViewState et Session? Plus précisément, j'aimerais savoir quel est le meilleur moyen de garder un objet disponible (en réglant en permanence les membres par des publications) tout au long du cycle de vie de ma page.ViewState Vs Session ... maintien de l'objet à travers le cycle de vie de la page

Actuellement, j'utilise Sessions pour cela, mais je ne suis pas sûr que ce soit la meilleure solution.

Par exemple:

SearchObject searchObject; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     searchObject = new SearchObject(); 
     Session["searchObject"] = searchObject; 
    } 
    else 
    { 
     searchObject = (SearchObject)Session["searchObject"]; 
    } 
} 

qui me permet d'utiliser mon searchObject nulle part ailleurs sur ma page, mais il est un peu lourd que je dois remettre ma session var si je change les propriétés, etc.

Je pense qu'il doit y avoir une meilleure façon de faire cela pour que .NET ne réinstancie pas l'objet chaque fois que la page se charge, mais le place également dans la portée globale de la classe Page.

+0

En plus des réponses ci-dessous, 'ViewState' exige que les éléments stockés soient sérialisables . Sinon, vous recevrez des exceptions de sérialisation. –

Répondre

55

Si l'objet recherché n'est pas très volumineux, utilisez alors ViewState. Un ViewState est parfait si vous voulez seulement que l'objet vive pour le cycle de vie de la page en cours.

Un objet de session est également bon à utiliser, mais évidemment, une fois que l'objet de recherche est là, il sera plus long pour le cycle de vie de la page.

En outre, une chose que je fais avec des objets ViewState/Session est enveloppez leur accès à une propriété:

public object GetObject 
{ 
    get 
    { 
     return ViewState["MyObject"]; 
    } 
    set 
    { 
     ViewState["MyObject"] = value; 
    } 
} 

J'ai tendance à trouver plus propre de le faire de cette façon. Changez simplement le code ci-dessus pour répondre à vos besoins.

+0

Salut Jason, alors que votre dévouement à l'amélioration du contenu sur Stack Overflow est apprécié, certaines personnes (dont moi-même) sont un peu mécontents de votre récente vague d'édition de mots jurés sur des questions anciennes. Il y a une discussion à ce sujet ici: [Nettoyons les messages de mauvaise qualité avec blasphème sur Stack Overflow] (http://meta.stackexchange.com/q/110682) Votre chaîne d'édition est apparue sur Meta, bien que la question concerne quelqu'un d'autres qui ont eu la même idée aujourd'hui: [Que se passe-t-il si un utilisateur recherche et ne supprime que le blasphème?] (http://meta.stackexchange.com/q/165752) –

+0

Bien que je ne puisse pas vous empêcher de faire ces modifications Je vous serais reconnaissant si vous pouviez revoir la discussion et envisager de ne pas systématiquement * chercher * pour ce genre de choses. Merci! –

+2

Assez juste. Je ne pensais pas que c'était approprié d'avoir ces mots. Je ne le ferai plus. –

25

d'abord Viewstate est par page alors que la session existe dans toute l'application au cours de la session en cours, si vous voulez que votre searchObject à persister sur plusieurs pages alors la session est la bonne voie à suivre. En second lieu, Viewstate est transféré en tant que texte crypté entre le navigateur et le serveur à chaque publication. Ainsi, plus vous stockez dans le Viewstate, plus le nombre de données descend et descend du client à chaque fois, tandis que la session est stocké côté serveur et la seule chose qui va et vient est un identifiant de session, soit comme un cookie ou dans l'URL. Que la session ou viewstate soit le bon endroit pour stocker votre objet de recherche dépend de ce que vous en faites et des données qu'il contient, nous espérons que l'explication ci-dessus vous aidera à choisir la bonne méthode à utiliser.

0

L'état d'affichage est spécifique à une page, où l'état de session est spécifique au navigateur. Vous ne pouvez pas transmettre les données d'une page à une autre via l'état d'affichage. Mais vous ferez avec l'état de session. Chaque session a un ID unique, où l'état Afficher Afficher les données stockées dans des champs masqués sur la page elle-même.Session stocker les données sur le côté serveur, où les données d'état d'affichage stockées sur la page, d'où la page lourde et l'application lente. Chaque contrôle a un état d'affichage vrai par défaut qui stocke son état (état de contrôle), nous pouvons l'activer ou le désactiver facilement en activant enablestate = false

Questions connexes