2010-07-09 5 views
1

Scratch this!Comment fonctionne Viewstate en interne

Je l'ai googlé mes fesses à la recherche de ceci. 1. Disons que j'ai un formulaire Web qui a quelques boîtes de texte, avec les textbox1 d'ID, textbox2, textbox3. Ils ont tous viewstate activé. Je place des valeurs dans ces zones de texte et j'appuie sur un bouton de publication vide et toutes les valeurs sont toujours présentes après la publication. Comment puis-je y accéder dans le viewstate après la publication? Je pense qu'ils ont été enregistrés sous le nom d'identification des boîtes de texte mais je ne l'obtiens pas pour fonctionner comme ça. Chaîne s = ViewState ["textbox1"]. ToString(); J'essaye de faire fonctionner ceci parce que je veux pouvoir enregistrer le viewstate dans la session ainsi je peux récupérer l'information après que je visite une autre forme de Web. 2. N'est-il pas juste que je puisse seulement utiliser viewstate sur la même page que celle sur laquelle il a été créé? Je ne pouvais pas utiliser viewstate sur default.aspx dans editor.aspx? 3. Et encore une chose, n'est-ce pas vrai que viewstate sauve comment un noeud treeview est dépensé? Je voudrais enregistrer l'état sur l'arborescence entre deux formulaires Web qui utilisent la même page maître.


EDIT:

Ok, cela ne suffisait pas claire, thats a donné. Fondamentalement, j'essaie de comprendre le viewstate et ce que je peux faire avec. Je n'utilise généralement pas viewstate pour stocker des valeurs. Ce que j'essaie de faire, ou comprendre si c'est possible avec viewstate.

J'ai une page maître et sur la page maître est une vue arborescente. J'ai deux pages que j'utilise avec la page maître, Default.aspx et editor.aspx. Je fais mes navigations et tout dans Default.aspx. Quand j'ai développé les nœuds dans l'arborescence et sélectionné l'un des treenode, le navigateurl sur ce treenode m'envoie à editor.aspx? NavID = 3. L'éditeur.aspx utilise la même page maître et je veux que cette page affiche l'état SAME sur l'arborescence comme l'a fait Default.aspx avant de cliquer sur le nœud.

+2

ceci est un excellent blog sur viewstate http://weblogs.asp.net/infinitiesloop/archive/2006/ 08/03/Truly-Understanding-Viewstate.aspx – dotjoe

+0

Qu'essayez-vous exactement de faire? POST les valeurs TextBox de default.aspx à editor.aspx? –

Répondre

1

La collection ViewState en System.Web.UI.Control ne vous permet d'accéder au sac pour viewstate que le contrôle, pas de contrôle de l'enfant. Donc, fondamentalement, vous ne pouvez pas faire ce que vous voulez faire avec ViewState.

Vous pouvez obtenir les valeurs affichées par un contrôle via les paramètres Request.Form. Par exemple, si vous avez un textbox1 d'appel de commande que vous pourriez obtenir sa valeur affichée par

Request.Form["textbox1"] 

En fonction de la commande que vous pourriez avoir à faire un peu de traitement sur la valeur que vous obtenez de là. Pour une vue arborescente, vous pouvez obtenir la valeur affichée de son état expansé en utilisant

Request.Form[TreeView1.ClientID + "_ExpandState"] 

La valeur est une chaîne avec soit un e (élargi) ou n (non expansé) pour chaque noeud. Donc, si la valeur était "eennene", les nœuds 1 2 5 et 7 seraient étendus alors que les autres ne seraient pas

+0

Je pourrais l'utiliser, je voudrais enregistrer cela dans la session et ouvrir à nouveau sur l'autre forme de Web. Comment est-ce que j'injecterais une chaîne à la vue d'arbre ainsi elle développerait la chaîne choisie. Basiquement aller dans l'autre sens ..? – eski

+0

vous auriez à faire un peu de traitement sur la chaîne dans le code derrière. Probablement le chargement de la page. Creusez cette chaîne qui contient les noeuds expansés hors de la session lors du chargement initial et définissez l'état des noeuds sur étendu ou réduit. –

+0

Ok, ce serait bien si je pouvais juste mettre la chaîne dans l'arborescence comme String nodeState = "nncceencnecne"; treeview.expandstate = nodestate; ;) Mais je devine que je dois passer par les noeuds avec foreach loop et injecter chacun des noeuds. – eski

2

La raison pour laquelle votre code ne fonctionne pas est que ASP.NET utilise un nom différent (je pense qu'il préfixe le nom du contrôle avec le nom du formulaire et le nom de la page maître, s'il y en a un). Mais même si vous pouviez le tirer en utilisant cette méthode, vous ne devriez pas. Vous devez ajouter manuellement une propriété à viewstate. Donc, si vous essayez de conserver le texte dans une zone de texte, utilisez le code suivant:

ViewState["TextBoxText"] = textbox1.ToString(); 

Et pour récupérer plus tard, utilisez:

String s = (String)ViewState["TextBoxText"]; 

Pour répondre à vos questions:

  1. Vous avez raison. Les vues sont sacrées pour chaque page et ne sont pas accessibles.
  2. Treeview sauvegarde automatiquement les nœuds étendus. Assurez-vous simplement que vous faites votre initialisation à l'arborescence dans un bloc if (! Page.IsPostBack).
+0

Plus sur la question 2. Aurais-je sauvegarder l'état des nœuds treeview dans viewstate et comment les récupérer? – eski

+0

@eski Je pense que vous devriez poser une question plus précise, peut-être même supprimer celle-ci entièrement (ou au moins l'éditer fortement) pour vraiment traiter votre scénario global, je pense que vous avez des idées fausses sur le travail avec webforms problème réel d'une mauvaise manière. –

+0

@eski Je suis sûr que vous n'avez rien à faire. Le contrôle treeview devrait enregistrer automatiquement les états de nœud sans que vous ayez à le faire. – Icemanind

4

Jetez un oeil à cet article pour en savoir plus sur viewstate.Je l'ai trouvé utile

Truly understanding viewstate

+0

+1 C'est un article génial pour apprendre ce que ViewState fait vraiment. –