每次將網頁發送到服務器時,都會創建網頁類的一個新實例。在傳統的Web編程中,這通常意味著在每一次往返行程中,與該頁及該頁上的控件相關聯的所有信息都會丟失。例如,如果用戶將信息輸入到文本框,該信息將在從浏覽器或客戶端設備到服務器的往返行程中丟失。
狀態管理是您對同一頁或不同頁的多個請求維護狀態和頁信息的過程。與所有基於 HTTP 的技術一樣,Web 窗體頁是無狀態的,這意味著它們不自動指示序列中的請求是否全部來自相同的客戶端,或者單個浏覽器實例是否一直在查看頁或站點。此外,到服務器的每一往返過程都將銷毀並重新創建頁;因此,如果超出了單個頁的生命周期,頁信息將不存在。
基於客戶端的狀態管理
視圖狀態
ViewState 屬性提供一個字典對象,用於在對同一頁的多個請求之間保留值。這是頁用來在往返行程之間保留頁和控件屬性值的默認方法。
在處理頁時,頁和控件的當前狀態會散列為一個字符串,並在頁中保存為一個隱藏域或多個隱藏域(如果存儲在 ViewState 屬性中的數據量超過了 MaxPageStateFieldLength 屬性中的指定值)。當將頁回發到服務器時,頁會在頁初始化階段分析視圖狀態字符串,並還原頁中的屬性信息。
ASP.NET狀態管理之十一(視圖狀態ViewState)
控件狀態
有時,為了讓控件正常工作,您需要按順序存儲控件狀態數據。例如,如果編寫了一個自定義控件,其中使用了不同的選項卡來顯示不同的信息。為了讓自定義控件按預期的方式工作,該控件需要知道在往返行程之間選擇了哪個選項卡。可以使用 ViewState 屬性來實現這一目的,不過,開發人員可以在頁級別關閉視圖狀態,從而使控件無法正常工作。為了解決此問題,ASP.NET 頁框架在 ASP.NET 中公開了一項名為控件狀態的功能。
ControlState 屬性允許您保持特定於某個控件的屬性信息,且不能像 ViewState 屬性那樣被關閉。
ASP.NET狀態管理之十二(控件狀態ControlState)
隱藏域
ASP.NET 允許您將信息存儲在 HiddenField 控件中,此控件將呈現為一個標准的 HTML 隱藏域。隱藏域在浏覽器中不以可見的形式呈現,但您可以就像對待標准控件一樣設置其屬性。當向服務器提交頁時,隱藏域的內容將在 HTTP 窗體集合中隨同其他控件的值一起發送。隱藏域可用作一個儲存庫,您可以將希望直接存儲在頁中的任何特定於頁的信息放置到其中。