超文本傳輸協議(HTTP)是一種無狀態協議。當客戶端與伺服器斷開連接時,ASP.NET引擎將丟棄頁對象。這樣,每個web應用程式都可以擴展到同時服務多個請求,而不會耗盡伺服器內存。
然而,需要一些技術來存儲請求之間的信息,並在需要時檢索它。此信息,即當前會話中當前用戶的所有控制項和變量的當前值,稱爲狀態。
ASP.NET管理四種狀態:
- View State
- Control State
- Session State
- Application State
View State
視圖狀態是頁面及其所有控制項的狀態。它是由ASP.NET框架跨帖子自動維護的。
將頁發送回客戶端時,將確定頁及其控制項的屬性更改,並將其存儲在名爲「VIEWSTATE」的隱藏輸入欄位的值中。當頁面再次被發回時,_VIEWSTATE欄位將與HTTP請求一起發送到伺服器。
視圖狀態可以啓用或禁用:
通過在web.config文件的<pages>部分設置EnableViewState屬性,整個應用程式。
通過將page指令的EnableViewState屬性設置爲<%@page Language=「C 35;」EnableViewState=「false」%>
通過設置control.EnableViewState屬性的控制項。
它使用由定義視圖狀態項集合的StateBag類定義的視圖狀態對象來實現。狀態包是一個包含屬性-值對的數據結構,存儲爲與對象關聯的字符串。
StateBag類具有以下屬性:
Properties | Description |
---|---|
Item(name) | The value of the view state item with the specified name. This is the default property of the StateBag class. |
Count | The number of items in the view state collection. |
Keys | Collection of keys for all the items in the collection. |
Values | Collection of values for all the items in the collection. |
StateBag類有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the view state collection and existing item is updated. |
Clear | Removes all the items from the collection. |
Equals(Object) | Determines whether the specified object is equal to the current object. |
Finalize | Allows it to free resources and perform other cleanup operations. |
GetEnumerator | Returns an enumerator that iterates over all the key/value pairs of the StateItem objects stored in the StateBag object. |
GetType | Gets the type of the current instance. |
IsItemDirty | Checks a StateItem object stored in the StateBag object to evaluate whether it has been modified. |
Remove(name) | Removes the specified item. |
SetDirty | Sets the state of the StateBag object as well as the Dirty property of each of the StateItem objects contained by it. |
SetItemDirty | Sets the Dirty property for the specified StateItem object in the StateBag object. |
ToString | Returns a string representing the state bag object. |
Example
下面的示例演示了存儲視圖狀態的概念。讓我們保留一個計數器,每次通過單擊頁面上的按鈕發回頁面時計數器都會遞增。label控制項顯示計數器中的值。
標記文件代碼如下:
<%@ 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++; } }
它將產生以下結果:
Control State
不能修改、直接訪問或禁用控制項狀態。
Session State
當用戶連接到ASP.NET網站時,將創建新的會話對象。當會話狀態打開時,將爲每個新請求創建一個新的會話狀態對象。此會話狀態對象成爲上下文的一部分,可通過頁面使用。
會話狀態通常用於存儲應用程式數據,如庫存、供應商列表、客戶記錄或購物車。它還可以保存有關用戶及其首選項的信息,並跟蹤掛起的操作。
會話通過120位SessionID進行標識和跟蹤,SessionID從客戶端傳遞到伺服器,然後作爲cookie或修改後的URL返回。SessionID是全局唯一和隨機的。
會話狀態對象是從HttpSessionState類創建的,該類定義會話狀態項的集合。
HttpSessionState類具有以下屬性:
Properties | Description |
---|---|
SessionID | The unique session identifier. |
Item(name) | The value of the session state item with the specified name. This is the default property of the HttpSessionState class. |
Count | The number of items in the session state collection. |
TimeOut | Gets and sets the amount of time, in minutes, allowed between requests before the session-state provider terminates the session. |
HttpSessionState類具有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the session state collection. |
Clear | Removes all the items from session state collection. |
Remove(name) | Removes the specified item from the session state collection. |
RemoveAll | Removes all keys and values from the session-state collection. |
RemoveAt | Deletes an item at a specified index from the session-state collection. |
會話狀態對象是一個名稱-值對,用於存儲和檢索會話狀態對象中的某些信息。您也可以使用以下代碼:
void StoreSessionInfo() { String fromuser = TextBox1.Text; Session["fromuser"] = fromuser; } void RetrieveSessionInfo() { String fromuser = Session["fromuser"]; Label1.Text = fromuser; }
上面的代碼只在會話字典對象中存儲字符串,但是,它可以存儲所有原始數據類型和由原始數據類型組成的數組,以及數據集、數據表、哈希表和圖像對象,以及從ISerializable對象繼承的任何用戶定義類。
Example
下面的示例演示了存儲會話狀態的概念。頁面上有兩個按鈕,一個用於輸入字符串的文本框和一個用於顯示上次會話中存儲的文本的標籤。
標記文件代碼如下:
<%@ 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 style="width: 568px; height: 103px"> <tr> <td style="width: 209px"> <asp:Label ID="lblstr" runat="server" Text="Enter a String" style="width:94px"> </asp:Label> </td> <td style="width: 317px"> <asp:TextBox ID="txtstr" runat="server" style="width:227px"> </asp:TextBox> </td> </tr> <tr> <td style="width: 209px"> </td> <td style="width: 317px"> </td> </tr> <tr> <td style="width: 209px"> <asp:Button ID="btnnrm" runat="server" Text="No action button" style="width:128px" /> </td> <td style="width: 317px"> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td style="width: 209px"> </td> <td style="width: 317px"> </td> </tr> <tr> <td style="width: 209px"> <asp:Label ID="lblsession" runat="server" style="width:231px" > </asp:Label> </td> <td style="width: 317px"> </td> </tr> <tr> <td style="width: 209px"> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td style="width: 317px"> </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"]; } }
執行文件並觀察其工作原理:
Application State
ASP.NET應用程式是web伺服器上單個虛擬目錄中所有網頁、代碼和其他文件的集合。當信息以應用程式狀態存儲時,所有用戶都可以使用它。
爲了提供應用程式狀態的使用,ASP.NET從HTTPApplicationState類爲每個應用程式創建一個應用程式狀態對象,並將該對象存儲在伺服器內存中。此對象由類文件global.asax表示。
應用程式狀態主要用於存儲命中計數器和其他統計數據,全局應用程式數據,如稅率、折扣率等,並跟蹤訪問站點的用戶。
HttpApplicationState類具有以下屬性:
Properties | Description |
---|---|
Item(name) | The value of the application state item with the specified name. This is the default property of the HttpApplicationState class. |
Count | The number of items in the application state collection. |
HttpApplicationState類具有以下方法:
Methods | Description |
---|---|
Add(name, value) | Adds an item to the application state collection. |
Clear | Removes all the items from the application state collection. |
Remove(name) | Removes the specified item from the application state collection. |
RemoveAll | Removes all objects from an HttpApplicationState collection. |
RemoveAt | Removes an HttpApplicationState object from a collection by index. |
Lock() | Locks the application state collection so only the current user can access it. |
Unlock() | Unlocks the application state collection so all the users can access it. |
應用程式狀態數據通常通過爲事件編寫處理程序來維護:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
以下代碼段顯示了存儲應用程式狀態信息的基本語法: