由于HTTP協(xié)議的無狀態(tài)特性,導致在ASP.NET編程中,每個請求都會在服務端從頭到執(zhí)行一次管線過程, 對于ASP.NET頁面來說,Page對象都會重新創(chuàng)建,所有控件以及內(nèi)容都會重新生成, 因此,如果希望上一次的頁面狀態(tài)能夠在后續(xù)頁面中保留,則必需引入狀態(tài)管理功能。
ASP.NET為了實現(xiàn)狀態(tài)管理功能,提供了8種方法,可幫助我們在頁面之間或者整個用戶會話期間保留狀態(tài)數(shù)據(jù)。 這些方法分為二類:視圖狀態(tài)、控件狀態(tài)、隱藏域、Cookie 和查詢字符串會以不同方式將數(shù)據(jù)發(fā)送到客戶端上。 而應用程序狀態(tài)、會話狀態(tài)和配置文件屬性(Profile)則會將數(shù)據(jù)存儲到服務端。 雖然每種方法都有不同的優(yōu)點和缺點,對于小的項目來說,可以選擇自己認為最容易使用的方法, 然而,對于有著較高要求的程序,尤其是對于性能與擴展性比較關(guān)注的程序來說, 選擇不同的方法最終導致的差別可能就非常大了。
在這篇博客中,我將談談自己對ASP.NET狀態(tài)管理方面的一些看法。
注意:本文的觀點可能并不合適開發(fā)小型項目,因為我關(guān)注的不是易用性。
hidden-input( 隱藏域)
hidden-input 這個名字我是取的,表示所有type="hidden"的input標簽元素。 在中文版的MSDN中,也稱之為 隱藏域 。 hidden-input通常存在于HTML表單之內(nèi),它不會顯示到頁面中, 但可以隨表單一起提交,因此,經(jīng)常用于維護當前頁面的相關(guān)狀態(tài),在服務端我們可以使用Request.Form[]來訪問這些數(shù)據(jù)。
一般說來,我通常使用hidden-input來保存一些中間結(jié)果,用于在多次提交中維持一系列狀態(tài), 或者用它來保存一些固定參數(shù)用來提交給其它頁面(或網(wǎng)站)。 在這些場景中,我不希望用戶看到這些數(shù)據(jù),因此,使用hidden-input是比較方便的。
關(guān)于表單的更多介紹可參考我的博客:細說 Form (表單)
在ASP.NET WebForm框架中,我們可以使用HiddenField控件來創(chuàng)建一個hidden-input控件,并可以在服務端操作它, 還可以直接以手寫的方式使用隱藏域,例如:
<input type="hidden" name="hidden-1" value="aaaaaaa" /> <input type="hidden" name="hidden-2" value="bbbbbbb" /> <input type="hidden" name="hidden-3" value="ccccccc" />
另外,我們還可以調(diào)用ClientScript.RegisterHiddenField()方法來創(chuàng)建隱藏域:
ClientScript.RegisterHiddenField("hidden-4", "ddddddddd");
輸出結(jié)果:
<input type="hidden" name="hidden-4" id="hidden-4" value="ddddddddd" />
這三種方法對于生成的HTML代碼來說,主要差別在于它們出現(xiàn)位置不同:
1. HiddenField控件:由HiddenField的出現(xiàn)位置來決定(在form內(nèi)部)。
2. RegisterHiddenField方法:在form標簽的開頭位置。
3. hidden-input:你寫在哪里就是哪里。
優(yōu)點:
1. 不需要任何服務器資源:隱藏域隨頁面一起發(fā)送到客戶端。
2. 廣泛的支持:幾乎所有瀏覽器和客戶端設備都支持具有隱藏域的表單。
3. 實現(xiàn)簡單:隱藏域是標準的 HTML 控件,不需要復雜的編程邏輯。
缺點:
1. 不能在多頁面跳轉(zhuǎn)之間維持狀態(tài)。
2. 用戶可見,保存敏感數(shù)據(jù)時需要加密。