ASP.NET ViewState 初探 (1) 轉自msdn

來源:互聯網
上載者:User
asp.net ASP.NET ViewState 初探
Susan Warren
Microsoft Corporation
2001 年 11 月 27 日

與剛接觸 ASP.NET 頁面的開發人員交談時,他們通常向我提出的第一個問題就是:“那個 ViewState 到底是什嗎?”他們的語氣中流露出的那種感覺,就象我來到一家異國情調的餐館,侍者端上一道我從未見過的菜肴時的那種感覺 - 既疑惑不解,又充滿好奇。但肯定有人認為它不錯,否則就不會提供了。所以,我會先嘗一嘗,或許會喜歡上它,儘管它看上去的確很古怪!

對於 ViewState 也是如此,但是如果適應了它的風格,您會發現在許多情況下,您將樂於在自己的 ASP.NET 應用程式中使用 ViewState,因為它可以協助您使用更少的程式碼完成更多的工作。但是,有時也會對 ViewState 完全棄之不用。下面我們就這兩種情況分別進行闡述,不過,讓我們先回答什麼是 ViewState 這個問題。

答案:ViewState 用於維護頁面的 UI 狀態
Web 是沒有狀態的,ASP.NET 頁面也沒有狀態,它們在到伺服器的每個往返過程中被執行個體化、執行、呈現和處理。作為 Web 開發人員,您可以使用眾所周知的技術(如以工作階段狀態將狀態儲存在伺服器上,或將頁面回傳到自身)來添加狀態。下面我們以圖 1 中的註冊表單為例進行論述。



圖 1:恢複回傳的表單值

從上圖中可以看出,我為便餐選擇了一個無效的值。此表單與 Web 上的多數表單一樣友好,它在出現錯誤的欄位旁邊顯示一條有用的錯誤訊息和一個星號。而且,表單中還顯示了我在其他文字框和下拉式清單中輸入的所有有效值。這在某種程度上是可能的,因為 HTML 表單元素會在 HTTP 標題中將其當前值從瀏覽器發送到伺服器。您可以使用 ASP.NET 跟蹤來查看回傳的表單值,如圖 2 所示。



圖 2:HTTP 表單中回傳的值(通過 ASP.NET 跟蹤顯示)

在 ASP.NET 之前,通過多次回傳將值恢複到表單欄位中完全是頁面開發人員的責任,他們將不得不從 HTTP 表單中逐個拾取回傳值,然後再將其推回欄位中。幸運的是,現在 ASP.NET 可以自動完成這項任務,從而為開發人員免除了一項令人厭煩的工作,同時也無需再為表單編寫大量的代碼。但這並不是 ViewState。

ViewState(英文)是一種機制,ASP.NET 使用這種機制來Tracing Service器控制項狀態值,否則這些值將不作為 HTTP 表單的一部分而回傳。例如,由 Label 控制項顯示的文本預設情況下就儲存在 ViewState 中。作為開發人員,您可以綁定資料,或在首次載入該頁面時僅對 Label 編程設定一次,在後續的回傳中,該標籤文本將自動從 ViewState 中重新填充。因此,除了可以減少繁瑣的工作和代碼外,ViewState 通常還可以減少資料庫的往返次數。

ViewState 的工作原理
ViewState 確實沒有什麼神秘之處,它是由 ASP.NET 頁面架構管理的一個隱藏的表單欄位。當 ASP.NET 執行某個頁面時,該頁面上的 ViewState 值和所有控制項將被收集並格式化成一個編碼字串,然後被分配給隱藏表單欄位的值屬性(即 <input type=hidden>)。由於隱藏表單欄位是發送到用戶端的頁面的一部分,所以 ViewState 值被臨時儲存在用戶端的瀏覽器中。如果用戶端選擇將該頁面回傳給伺服器,則 ViewState 字串也將被回傳。在上面的圖 2 中可以看到 ViewState 表單欄位及其回傳的值。

回傳後,ASP.NET 頁面架構將解析 ViewState 字串,並為該頁面和各個控制項填充 ViewState 屬性。然後,控制項再使用 ViewState 資料將自己重新恢複為以前的狀態。

關於 ViewState 還有三個值得注意的小問題。

如果要使用 ViewState,則在 ASPX 頁面中必須有一個伺服器端表單標記 (<form runat=server>)。表單欄位是必需的,這樣包含 ViewState 資訊的隱藏欄位才能回傳給伺服器。而且,該表單還必須是伺服器端的表單,這樣在伺服器上執行該頁面時,ASP.NET 頁面架構才能添加隱藏的欄位。
頁面本身將 20 位元組左右的資訊儲存在 ViewState 中,用於在回傳時將 PostBack 資料和 ViewState 值分發給正確的控制項。因此,即使該頁面或應用程式禁用了 ViewState,仍可以在 ViewState 中看到少量的剩餘位元組。
在頁面不回傳的情況下,可以通過省略伺服器端的 <form> 標記來去除頁面中的 ViewState。
充分利用 ViewState
ViewState 為跨回傳跟蹤控制項的狀態提供了一條神奇的途徑,因為它不使用伺服器資源、不會逾時,並且適用於任何瀏覽器。如果您要編寫控制項,那麼肯定需要瞭解如何在控制項中維護狀態(英文)。

開發人員在編寫頁面時同樣可以按照幾乎相同的方式來利用 ViewState,只是有時頁面會包含不由控制項儲存的 UI 狀態值。您可以跟蹤 ViewState 中的值,使用的編程文法與會話和快取的文法類似:

[Visual Basic]
' 儲存在 ViewState 中
ViewState("SortOrder") = "DESC"

' 從 ViewState 中讀取
Dim SortOrder As String = CStr(ViewState("SortOrder"))

[C#]
// 儲存在 ViewState 中
ViewState["SortOrder"] = "DESC";

// 從 ViewState 中讀取
string sortOrder = (string)ViewState["SortOrder"];


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。