Как Viewstate работает внутри - PullRequest
1 голос
/ 09 июля 2010

Поцарапайте это!

Я искал свою задницу в поисках этого. 1. Допустим, у меня есть веб-форма с несколькими текстовыми полями, с идентификатором textbox1, textbox2, textbox3. У них всех включено состояние просмотра. Я помещаю некоторые значения в эти текстовые поля и нажимаю пустую кнопку обратной передачи, и все значения остаются там после обратной передачи. Как я могу получить к ним доступ в viewstate после обратной передачи? Я бы подумал, что они были сохранены под именем ID текстовых полей, но я не могу заставить его работать так. String s = ViewState ["textbox1"]. ToString (); Я пытаюсь заставить это работать, потому что я хочу иметь возможность сохранить состояние представления в сеансе, чтобы я мог получить информацию после того, как зашел на другую веб-форму. 2. Разве это не правильно, что я могу использовать viewstate только на той же странице, на которой он был сделан? Я не мог использовать viewstate на default.aspx в editor.aspx? 3. И еще одна вещь, не правда ли, что состояние представления сохраняет то, как узлы древовидной структуры расходуются? Я хотел бы сохранить состояние в древовидной структуре между двумя веб-формами, использующими одну и ту же главную страницу.


EDIT:

Хорошо, это не было достаточно ясно, это дано. По сути, я пытаюсь понять представление о состоянии и что я могу с ним сделать. Я обычно не использую viewstate для хранения значений.

Что я пытаюсь сделать или выяснить, возможно ли это с помощью viewstate.

У меня есть главная страница, а на главной странице есть древовидная структура. У меня есть две страницы, которые я использую с главной страницей, Default.aspx и editor.aspx. Я делаю навигацию и все в Default.aspx. Когда я развернул узлы в древовидном меню и выбрал один из триодов, навигатор на этом триоде отправит меня в editor.aspx? NavID = 3. Editor.aspx использует ту же главную страницу, и я хочу, чтобы на этой странице отображалось то же состояние в древовидной структуре, что и в Default.aspx до того, как я щелкнул узел.

Ответы [ 3 ]

4 голосов
/ 09 июля 2010

Посмотрите эту статью, чтобы узнать больше о viewstate.Я нашел это полезным

Истинно понимая viewstate

2 голосов
/ 09 июля 2010

Причина, по которой ваш код не работает, заключается в том, что ASP.NET использует другое имя (я думаю, что в нем перед именем элемента управления указывается имя формы и имя главной страницы, если оно есть).Но даже если бы вы могли вытащить это, используя этот метод, вы не должны.Вы должны вручную добавить свойство в viewstate.Поэтому, если вы пытаетесь сохранить текст в текстовом поле, используйте следующий код:

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

А чтобы получить это позже, используйте:

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

Чтобы ответить на ваши вопросы:

  1. Вы правы.Состояния просмотра являются священными для каждой отдельной страницы и недоступны
  2. Treeview автоматически сохраняет расширенные узлы.Просто убедитесь, что вы выполняете инициализацию в виде дерева внутри блока if (! Page.IsPostBack).
1 голос
/ 09 июля 2010

Коллекция Viewstate в System.Web.UI.Control позволяет получить доступ только к сумке viewstate для этого элемента управления, но не для дочерних элементов управления.Таким образом, вы не можете делать то, что хотите, через ViewState.

Вы можете получить значения, которые элемент управления отправил через параметры Request.Form.Например, если у вас есть контрольный вызов textbox1, вы можете получить его объявленное значение через

Request.Form["textbox1"]  

В зависимости от элемента управления вам, возможно, придется выполнить некоторую обработку значения, которое вы получаете оттуда.Для древовидного представления вы можете получить опубликованное значение его расширенного состояния, используя

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

. Значение представляет собой строку с e (расширенный) или n (не расширенный) для каждого узла.Таким образом, если бы значение было «eennene», узлы 1 2 5 и 7 были бы расширены, в то время как другие не были бы

...