超文本傳輸協定(HTTP)是一種無狀態協定。當客戶端從伺服器斷開連線時,ASP.NET 引擎將丟棄頁面物件。這樣一來,每個Web 應用程式能夠擴展到同時用於大量請求,但是不會耗盡伺服器記憶體。
然而,需要有一些技術來儲存各個請求之間的資訊並在需要時取回。這個資訊則稱為狀態,即所有控制項的目前值和目前工作階段中目前使用者使用的變數。
ASP.NET 管理四種狀態:
視圖狀態
控制狀態
會話狀態
應用程式狀態
視圖狀態是頁面及其所有控制項的狀態。它透過ASP.NET 框架的回饋保持不變。
當一個頁面被傳送回客戶端,這些頁面變化的屬性及其控制項是確定的,並儲存在名為_VIEWSTATE 的一個隱藏輸入欄位的值內。當頁面再次回傳時,_VIEWSTATE 欄位隨HTTP 請求被傳送到伺服器。
視圖狀態可以啟用或停用以下內容:
整個應用程式:設定web.config 檔案中部分的EnableViewState 屬性。
一個頁面:設定頁面指令的EnableViewState 屬性為<%@ Page Language="C#" EnableViewState="false" %>
一個控制項:設定控制項.EnableViewState 屬性。
它透過使用視圖狀態對象,該物件是由被一組視圖狀態項目定義的StateBag 類別定義的。該StateBag 是一種資料結構,包含屬性值對並被儲存為與物件相關聯的字串。
StateBag 類別具有以下屬性:
屬性 | 描述 |
---|---|
Item(name) | 具有指定名稱的視圖狀態的值,是StateBag 的預設屬性。 |
Count | 狀態集合中的項目名稱。 |
Keys | 集合中所有項目的密鑰集合。 |
Values | 集合中所有項目的值的集合。 |
StateBag 類別具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 新增一個項目到視圖狀態集合,更新現有項目。 |
Clear | 移除集合中所有項目。 |
Equals(Object) | 確定指定的物件是否等於目前物件。 |
Finalize | 允許釋放資源並執行其他清理操作。 |
GetEnumerator | 傳回儲存在StateBag 物件中重複的StateItem 物件的密鑰/值對的計數器。 |
GetType | 取得目前實例的類型。 |
IsItemDirty | 檢查儲存在StateBag 物件以確認其是否已被修改。 |
Remove(name) | 移除制定項目。 |
SetDirty | 設定StateBag 物件的狀態以及每個由其包含的StateItem 物件的Dirty 屬性。 |
SetItemDirty | 為在StateBag 物件中的指定StateItem 物件設定Dirty 屬性。 |
ToString | 傳回代表狀態包物件的字串。 |
以下實例說明了儲存視圖狀態的字串的概念。
讓我們保持一個計數器,透過點擊頁面上的一個按鈕,該計數器能夠在每次頁面被調回時遞增。標籤控制項顯示計數器的值。
標記文件代碼如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
該實例的後台程式碼檔案如下所示:
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
它將產生以下結果:
控制狀態不能直接修改,存取或停用。
當使用者連接到ASP.NET 網站,一個新的會話物件將會被建立。當會話狀態開啟時,新的會話狀態會為每一個新的請求而建立。這種會話狀態物件會成為運作環境中的一部分並可透過頁面使用。
會話狀態通常用於儲存應用程式數據,例如詳細目錄,供應商清單,客戶記錄或購物車。它可以儲存用戶的信息及其偏好訊息,並保存用戶未決定的路徑。
會話由120 位元的SessionID 識別和跟踪,從客戶端傳遞到伺服器並且作為cookie 或修改的URL 回傳。 SessionID 是全球唯一的,隨機的。
會話狀態物件由HttpSessionState 類別創建,它定義會話狀態項目集合。
HttpSessionState 類別具有以下屬性:
屬性 | 描述 |
---|---|
SessionID | 唯一的會話識別碼。 |
Item(name) | 具有指定名稱的會話狀態項目的值,是HttpSessionState 類別的預設屬性。 |
Count | 會話狀態集合中項目的數量。 |
TimeOut | 取得和設定時間量,幾分鐘內,在供應商停止會話狀態前在請求間被允許。 |
HttpSessionState 類別有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 新增新的項目到會話狀態集合。 |
Clear | 移除會話狀態集合中所有項目。 |
Remove(name) | 移除會話狀態集合中的指定項目。 |
RemoveAll | 移除會話狀態集合中所有金鑰和值。 |
RemoveAt | 從會話狀態集合中刪除指定索引處的項目。 |
會話狀態物件是一個名稱- 值對,它可以從會話狀態物件中儲存和檢索資訊。同樣地,您可以使用以下程式碼:
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
以上程式碼只儲存在會話字典物件中的字串,但是,它可以儲存所有原始資料類型和由原始資料類型組成的陣列,DataSet, DataTable, HashTable, 和圖像對象,以及繼承ISerializable 物件的任意使用者定義的類。
以下實例說明了儲存會話狀態的概念。在頁面上有兩個按鈕:輸入字串的文字方塊按鈕和顯示從最後一個會話儲存的文字的標籤按鈕。標記文件代碼如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
在設計視圖中應有如下顯示:
後台程式碼如下:
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
執行檔並觀察其如何運作:
ASP.NET 應用程式是在Web 伺服器上所有網頁,程式碼和單一虛擬目錄的其他檔案的集合。當資訊儲存在應用程式狀態,它可以供所有使用者使用。
為了提供應用程式狀態的使用,ASP.NET 從HttpApplicationState 類別中為每個應用程式建立一個應用程式狀態對象,並將該對象儲存在伺服器記憶體中。該物件是由類別檔案global.asax 表示。
應用程式狀態主要用於儲存計數器,其他統計數據及稅率,折扣率等所有應用程式數據,並儲存使用者存取網站的路徑。
HttpApplicationState 類別具有以下屬性:
屬性 | 描述 |
---|---|
Item(name) | 具有指定名稱的應用程式項目的值,是HttpApplicationState 的預設屬性。 |
Count | 應用程式狀態集合中項的數量。 |
HttpApplicationState 類別有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 新增新的項目到應用程式狀態集合。 |
Clear | 移除應用程式狀態集合中的所有項目。 |
Remove(name) | 移除應用程式狀態集合中的指定項目。 |
RemoveAll | 移除一個HttpApplicationState 集合中所有物件。 |
RemoveAt | 移除從索引找到的集合中的一個HttpApplicationState 物件。 |
Lock() | 鎖定應用程式狀態集合以便只有當前使用者可以存取。 |
Unlock() | 解鎖應用程式狀態集合以便所有使用者可以存取。 |
應用程式狀態的資料通常是由為事件編寫的處理程序維護:
應用程式開啟
應用程式結束
應用程式錯誤
會話開始
會話結束
以下程式碼片段展示了用於儲存應用程式狀態資訊的基本語法:
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}