2010-07-09 103 views
1

Scratch this!Viewstate如何在內部工作

我已經搜索了我的屁股尋找這個。 1.假設我有一個帶有幾個文本框的網絡表單,其ID爲textbox1,textbox2,textbox3。他們都啓用了視圖狀態。 我在這些文本框中放了一些值,並推送一個空的回發按鈕,回傳後所有的值仍然存在。如何在回發後在視圖狀態下訪問它們? 我會認爲他們被保存在文本框的ID名下,但我沒有讓它像這樣工作。 String s = ViewState [「textbox1」]。ToString(); 我試圖讓這個工作,因爲我想能夠保存viewstate到會話,所以我可以檢索信息後,我訪問另一個webform。 2.是不是我只能在同一個頁面上使用viewstate? 我無法使用editor.aspx中default.aspx的viewstate? 3.還有一件事,viewstate節省了treeview節點的花費是不是正確的?我想在使用相同masterpage的兩個webforms之間的treeview中保存狀態。


編輯:

好吧,這還不夠清楚,那是理所當然的。 基本上,我試圖瞭解viewstate和我能用它做什麼。 我通常不使用viewstate來存儲值。

我想要做什麼,或者找出它是否可能與視圖狀態。

我有一個masterpage,並在masterpage上是一個treeview。我有兩個頁面,我使用masterpage,Default.aspx和editor.aspx。 我做我的導航和Default.aspx中的一切。當我在TreeView中展開節點並選擇了一個treenode時,treenode上的導航將我發送給editor.aspx?navID = 3。 editor.aspx使用相同的母版頁,並且我希望該頁面在樹狀視圖上顯示SAME狀態,就像Default.aspx在單擊節點之前所做的那樣。

+2

這是一個關於viewstate的優秀博客http://weblogs.asp.net/infinitiesloop/archive/2006/ 08/03/Truly-Understanding-Viewstate.aspx – dotjoe 2010-07-09 16:52:34

+0

你究竟在做什麼? POST default.aspx的TextBox值到editor.aspx? – 2010-07-09 16:56:53

回答

1

ViewState中收集System.Web.UI.Control只允許訪問視圖狀態袋該控件,不子控件。所以基本上你不能通過ViewState做你想做的事情。

您可以獲取控件通過Request.Form參數發佈的值。舉例來說,如果你有一個控制呼叫TextBox1中,你可以通過

Request.Form["textbox1"] 

得到貼出的價值取決於你可能必須做你離開那裏值一些處理的控制。對於樹形視圖,您可以使用

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

,該值與任何一個電子(擴)或每個節點的N(不擴展)的字符串獲得其擴張狀態的公佈值。因此,如果值爲「eennene」,節點1 2 5和7將被擴展,而其他節點將不會被擴展

+0

我可以使用這個,我會保存在會話中,並在另一個webform上再次打開。 我將如何注入一個字符串到樹視圖,所以它會擴大選定的字符串。基本上走另一條路..? – eski 2010-07-09 17:22:16

+0

你必須對代碼後面的字符串做一些處理。可能是頁面加載。在初始加載時挖掘包含展開的節點的字符串,並將節點的狀態設置爲展開或摺疊狀態。 – 2010-07-09 18:02:29

+0

好吧,如果我可以只將字符串放在樹狀視圖中就好了,如 String nodeState =「nncceencnecne」; treeview.expandstate = nodestate; ;) 但我猜我必須通過與foreach循環的節點,並注入每個節點和每個人。 – eski 2010-07-09 21:23:52

2

你的代碼無法工作的原因是因爲ASP.NET使用了不同的名稱(我認爲它在控件名稱前加上了表單名稱和主頁面名稱,如果有的話)。但即使你可以用這種方法拉它,你也不應該這樣做。您應該手動將屬性添加到視圖狀態。所以,如果你想保存在文本框中的文本,使用下面的代碼:

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

而中檢索此之後,使用:

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

回答您的問題:

  1. 你說得對。視圖狀態對每個頁面都是神聖的,不能被訪問
  2. Treeview會自動保存擴展節點。只要確保你正在做一個if(!Page.IsPostBack)塊內的treeview初始化。
+0

有關問題2的更多信息。我將視圖狀態中的treeview節點狀態保存下來,我將如何恢復它們? – eski 2010-07-09 16:56:33

+0

@eski我認爲你應該發佈一個更具體的問題,甚至可能完全刪除這個問題(或至少編輯它)來真正解決你的整體情況,我認爲你有一些關於使用webforms的更大的誤解,並且正在解決你的問題實際問題是錯誤的。 – 2010-07-09 16:59:21

+0

@eski我很確定你不需要做任何事情。樹視圖控件應該自動保存節點狀態,而無需執行此操作。 – Icemanind 2010-07-09 17:12:36

4

看看這篇文章,瞭解更多關於viewstate。我發現它有助於

Truly understanding viewstate

+0

+1這是一篇很棒的文章,用於學習ViewState的真正功能。 – 2010-07-09 17:10:15