Web開發有一個很大的特點,就是基於 Http 協議的通信方式。 Http 協議特點就是一個 Request 就有而只有一個 Response ,而且是無狀態的通信方式。什麼是無狀態呢?那就是 client 端並沒有一個狀態記錄,每次 client 端的頁面都是從 server 端重新加載的, client 端之前所有的一切都會丟失,被從 server 端的數據重新覆蓋。這就是爲什麼你在瀏覽網頁的時候會看見出現一閃即逝的白屏,那就是 client 端刷新到之前的網頁,而開始渲染剛從 server 端讀到的數據。
這個特點非常重要,對我們實現一些功能有很大的影響。更詳細的 http 模型請參考 。
那麼因爲 Asp.net 可以像有狀態一樣操作呢。我登陸了一個網站,接着我都是以我這個身份瀏覽其他頁面。我開始搜索,把搜索結果翻到第二頁,搜索條件我並沒有重新輸入啊。這些操作除了頁面有刷新,其他的就像你操作一個 winform 程序沒什麼區別。那 Asp.net 是怎麼做到的呢?
答案就是頁面狀態。 Asp.net 允許使用各種技術來幫助我們維持頁面狀態。
1. Session 。 當用戶打開一個網站,就 server 端會分配一個 Session ,每個用戶的 Session 都保存在服務器端,各不一樣,不會被互相干擾。在 Asp.net 中的 Session 是一個 Dictionary[string, object] 。你可以用 Session[“key1”] = 100, 或者 object value1 = Session[“key1”] 。
2. Cookie 。 用戶對應每個網站,都會在 client 端開闢一個 cookie 文件,來保存用戶的 cookie 信息。 Cookie 只能存儲 string 類型的信息,而且避免記錄敏感信息,因爲 Cookie 記錄在 client 端,容易被人竊取。需要注意的是, cookie 是可以被用戶禁用的,所以在開發網頁的時候不能太過依賴 cookie 。
3. ViewState 。 ViewState 是 asp.net 的一個概念,可以存儲一個頁面上的所有狀態。特別要提示的是 ViewState 只能保存一個頁面的狀態,跨頁面就不行了。 ViewState 是一個類似 Dictionary[string, object] 的集合。它的用法和 Session 差不多,不過需要注意的是放入 ViewState 中的 object 必須是能夠被序列化的。所有頁面中的控件都會有自己的 ViewState ,不會相互干擾。
4. HiddenField 。 Asp.net 有一個 HiddenField 控件,你會發現添加了這個控件頁面並沒有任何顯示,但其實它是一個隱藏控件,在 html 下的表示爲 <input type=”hidden”/> 。是可以保持頁面的數據。它的功能有點像 ViewState ,不過只能保存 string 類型的數據。
5. QueryString 。 QueryString 是一種對 Url 上的請求,比如: http://localhost/default.aspx?key1=value1&key2=value2,在 Asp.net 中, QueryString 是一個類似 Dictionary<string, string> 的數組。你可以用 string value1 = QueryString[“key1”] 來取值。
6. Application 。 Application 是 server 端的一個全局的狀態變量。要注意的是,首先,這個狀態變量是建立在內存中的,其次是這個狀態變量是可以被網站的所有頁面訪問的。這就意味着它只能存儲一些要公佈的信息,而不能存儲一些比較個人的信息了。
7. Cache 。 Cache 也是 server 端的全局的狀態變量,而且它除了擁有 Application 的功能以外,還有一些它自己的特性,自動更新和釋放。所有 Cache 比起 Application 更具有靈活性。在 Asp.net 裏面你可以這樣使用 Cache 。 Cache["key1"] = "Value 1"; 或者 Cache.Add("Key1", "Value"); 。
以上就是 Asp.net 可以使用的保持頁面狀態的機制。但是不要忘記,所有開闢在 server 端內存中的頁面狀態都會因爲 website 重啓中消失,但是導致 website 重啓的可能性實在太多,所以太過依賴於服務器的 Session,Application,Cache 都不是安全的。當然, Asp.net 允許我們並不一定把頁面狀態存放在內存中哦,讓我在之後講。