Asp.net控制項開發學習筆記(五)---Asp.net客戶端狀態管理

Asp.net提供了很多種與客戶端狀態交互的方式,控制項開發人員可以給控制項添加額外的值(比如控制項的ViewState)來使控制項貌似能記住前一個值.Asp.net提供了四種客戶端狀態管理的方式。他們是:

lViewState

lURL strings

lHidden Html Variables

lCookies

URL String

利用URL傳值請求伺服器是簡單並且應用最廣泛的。比如在電子商務中,一個像這樣的地址:

http://xxx.com/product.aspx?categoryid=1&productid=1

表示傳入兩個鍵值對。

在伺服器接收對應值時可以用Request對象的QueryString屬性和Params屬性來進行訪問,也可以利用Request本身的索引器來訪問,比如Request[「category」]。

注意:QueryString屬性只能訪問以GET方式傳的值.

Cookies

Cookies是一個通過在Http協議中添加額外的信息讓伺服器和客戶端共同實現在用戶的機器上存儲一定量的信息.Cookies里存放的信息針對特定站點,並且有時間限制。這意味著Cookies在一個站點存放的信息只能這個站點讀取,而不能在其他站點被讀取。

Cookies的信息是通過Http頭裡發送Set-Cookies然後加上伺服器想在客戶端存儲的信息.

在Asp.net中對Cookies的操作是通過HttpResponse類的Cookies屬性.

給客戶端的Cookies賦值的代碼如下:

Response.Cookies["LastVisit"].Value = DateTime.Now.ToShortDateString();

Response.Cookies["LastVisit"].Expires = DateTime.Now.AddDays(1);

這兩行代碼會在Http頭中傳送到客戶端伺服器,HTTP會如下:

Set-Cookie: LastVisit=mm/dd/yy; path=/

當在對此代碼進行讀取時,只需要利用Request對象中的Cookies屬性,代碼如下

string firstname = Request.Cookies["LastVisit"].Value;

在Cookies中,不要存儲大量信息.在控制項開發的過程中,盡量不要使用Cookies,因為Cookies可能被客戶端瀏覽器禁用.

HTML Hidden variables

Html hidden variable也是被經常使用的客戶端狀態存儲方式,在這種方式相對於前兩種方式的優勢在於,這種方式沒有傳送位元組的大小限制,並且不用怕客戶端瀏覽器不支持(啥?難道有不支持HTML的瀏覽器???)

利用Http Post方法,可以將客戶端的Hidden variable回傳到伺服器.Asp.net通過System.Web.UI.HtmlControls.HtmlInputForm伺服器控制項,這個控制項會在頁面中產生如下代碼:

<form id="first" method="post" runat="server">

而當render到客戶端時,會產生如下代碼

<form id="first" method="post" action=」first.aspx」>

注意,first.aspx就是指向頁面本身

再來看一個完全點的例子:

<form id="first" method="post" runat="server">

<input type="text" value="CareySon" id="name" />

<input type="text" value="Write Code" id="Task" />

</form>

當上面的form被提交時,或者利用javascript來提交時,asp.net會將當前所有的input格式化成字元串以便服務端進行提取.上面的代碼格式化成字元串時會變成:

Name=CareySon&Task==Write Code

而在伺服器端進行讀取時,可以使用Request對象的Form屬性索引器或者Params屬性索引器:

string name = Request.Form["name"];

string task = Request.Params["task"];

Asp.net的回傳機制也可以用下圖表示:

劍是雙刃的,當然Hidden Form也並不是只有好處。比如Hidden Form的值雖然不顯示在網頁中,但是依然可以被用戶查看,所以不要在Hidden Form里存放敏感信息,否則必須的進行字元串加密.還有當Hidden Form中存放的值過大時,會有一些潛在的性能問題.因為每次進行Post提交的時都會將所有的Hidden Form提交的伺服器L

當然,雖然有一些缺點,但Hidden Form還是在控制項開發中儲存狀態信息的比較好的方式.

ViewState

ViewState的本質其實就是在Hidden Form上抽象出一層,換句話說,ViewState的存儲原理其實就是利用了Hidden Form.ViewState。克服了Hidden Form一些硬性弱點,比如ViewState會對Hidden Form里的值進行壓縮,編碼使減少傳輸的大小並使客戶端無法查看Hidden Form里的值。在本質上ViewState就是如下一個Hidden Form:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=" " />

ViewState還有一個比較有用的作用是用於存儲控制項狀態.即存儲與控制項有關的數據.ViewState是System.Web.UI.StateBag類的實例,而StateBag實現了很多的介面,如下:

介面

描述

ICollection

Defines enumerators, synchronization methods, and size for collections

IDictionary

Specialized collection interface that implements a collection of name/value pairs

IEnumerable

Provides the enumerator for iteration over a collection

IStateManager

Defines the properties and methods required to support ViewState management in server controls

其中最有趣的是IStateManager介面.StateManager實現了這個介面用於存儲和載入控制項的ViewState. .net Framework利用ISateManager對控制項的ViewState在被序列化並存入名稱為_viewstate的Hidden Form中之前進行精簡.

在ViewState的狀態信息中存儲著以鍵/值對方式存儲的控制項信息,(包括當前頁面,因為System.Web.UI.Page也是繼承於System.Web.UI.Control的)。在頁面執行過程中.ViewState會被Hash運算和壓縮.最終存入名稱為_ViewState的Hidden Form中。此外,ViewState能夠防止修改,任何在Asp.net頁面處理周期之外對ViewState的修改都會被Asp.net發現並且做出處理。

簡單的使用

ViewState聽起來很複雜,但是使用起來卻非常簡單.對ViewState賦值的時候只需要:

ViewState["Task"] = "Write Code";

上面的代碼在客戶端生成的時候會生成如下代碼:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyhc2spkL8ufmlbb5xWbI/" />

對ViewState的讀取也是類似的方法.代碼如下:

string task = ViewState["Task"].ToString();

頁面中的ViewState在很多時候會很龐大,這大大加重了伺服器負擔。所以開發人員需要將不需要ViewState的控制項的EnableViewState設置成false,這個屬性時System.Web.UI.Control的,這意味著所有的控制項都具有這個屬性.

推薦閱讀:

基於Teamcenter Engineering的技術狀態管理
Redux 入門

TAG:學習 | 管理 | 控制 | 筆記 | 客戶端 | 客戶 | 狀態 | 控制項 | 狀態管理 |