頁面狀態機制的具體實現原理
上次我們講到了 Asp.net 提供了一系列的維持頁面狀態的機制,有 Session, Cookie, ViewState , Application , Cache , HiddenField 等。這次我來討論一下一些機制是如何實現的。
- Session 。 Session 的實現是依賴於 SessionID 的,每次 client 端訪問 server 端的時候,服務器都會給 client 分配一個 SessionID ,下次 client 再次訪問的時候,在 Request 裏面把這個 SessionID 一起提交給 Server , Server 就能根據 Request 裏面的 SessionID 來找到在 Server 端所儲存的數據了。那麼現在的問題就是這個 SessionID 在 client 端被放在哪裏了呢?答案就是 Cookie 中,但是如果 client 端禁用了 Cookie ,那這個 SessionID 又該怎麼辦呢?哈哈,還可以通過 QueryString 來傳遞。所以 Session 機制的實現是依賴於 Cookie 和 QueryString 的。
- ViewState 。前文提到,在 ViewState 中存放的對象必須是可以序列化的對象,這是和它的實現機制有很大關聯的。序列化可以把內存中的對象轉變爲 string ,還可以根據 string 轉變回內存中的對象,這種機制是方便了我們進行對象的持久化。 Asp.net 把放入 ViewState 中的對象作爲一個整體序列化成爲一個 HiddenField 中 string 的 Value 。 HiddenField 前文已經提到了,是一個頁面的隱藏域,每次 Postback 之後,這個 HiddenField 中的 value 就會被傳回並被反序列化爲 ViewState 。所以 ViewState 的實現就是依賴於 HiddenField ,你可以看見每個頁面再 Render 到 client 端的時候都會帶有一個這樣的 HiddenField, <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="XXX"/> 。看,這就是在 Client 端的 ViewState 了,不過由於是序列化過的,我也不知道里面是什麼了。所以 ViewState 是不能在 Client 端進行操作的,不過普通的 HiddenField 就可以哦
- 其他的頁面狀態實現的機制就比較簡單。 Cookie 是在 Client 端以文件方式存儲的。 Application 和 Cache 是在 server 端內存中存儲。 QueryString 是在 Url 裏面存儲。 HiddenField 是以 Html 元素存儲。
希望瞭解了這些機制以後,能使你更清楚地瞭解什麼時候該使用哪種機制來存儲頁面的狀態。