超文本傳輸協議(HTTP)是一種無狀態協議。 當客戶端從伺服器斷開連接時,ASP.NET引擎將丟棄頁面對象。 這樣,每個Web應用程式都可以擴展以同時提供大量請求,而不會耗盡伺服器記憶體。
但是,需要一些技術來在請求之間存儲資訊並在需要時檢索相關資訊。即當前會話中當前用戶的所有控制和變數的當前值被稱為狀態。
ASP.NET管理四種類型的狀態:
- 視圖狀態
- 控件狀態
- 會話狀態
- 應用狀態
視圖狀態
視圖狀態是頁面及其所有控件的狀態。 它由ASP.NET框架在發送之間自動維護。
當頁面被發送回客戶端時,頁面及其控件屬性的改變被確定,並存儲在名為_VIEWSTATE
的隱藏輸入字段的值中。當頁面再次被回發時,_VIEWSTATE
字段被發送到具有HTTP請求的伺服器。
視圖狀態可以被啟用或禁用:
- 整個應用程式通過在
Web.config
檔的<pages>
部分中設置EnableViewState
屬性。 - 通過將
Page
指令的EnableViewState
屬性設置為<%@ Page Language="C#" EnableViewState="false" %>
- 通過設置控件的
Control.EnableViewState
屬性。
它使用由StateBag
類定義的視圖狀態對象來實現,該類定義視圖狀態項的集合。狀態包是一個包含屬性值對的數據結構,存儲為與對象關聯的字串。
StateBag
類具有以下屬性:
編號 | 屬性 | 描述 |
---|---|---|
1 | Item(name) |
具有指定名稱的視圖狀態專案的值。這是StateBag 類的默認屬性。 |
2 | Count |
視圖狀態集合中的專案數量。 |
3 | Keys |
集合中所有專案的鍵集合。 |
4 | Values |
集合中所有專案的值的集合。 |
StateBag
類具有以下方法:
編號 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
將專案添加到視圖狀態集合,並更新現有專案。 |
2 | Clear |
刪除集合中的所有專案。 |
3 | Equals(Object) |
確定指定的對象(Object )是否等於當前對象。 |
4 | Finalize |
允許它釋放資源並執行其他清理操作。 |
5 | GetEnumerator |
返回一個枚舉器,該枚舉器遍曆存儲在StateBag 對象中的StateItem 對象的所有鍵/值對。 |
6 | GetType |
獲取當前實例的類型。 |
7 | IsItemDirty |
檢查存儲在StateBag 對象中的StateItem 對象,以確定它是否已被修改。 |
8 | Remove(name) |
刪除指定的專案。 |
9 | SetDirty |
設置StateBag 對象的狀態以及它包含的每個StateItem 對象的Dirty 屬性。 |
10 | SetItemDirty |
設置StateBag 對象中指定的StateItem 對象的Dirty 屬性。 |
11 | ToString |
返回表示狀態包對象的字串。 |
示例
以下示例演示了存儲視圖狀態的概念。使用一個計數器,通過單擊頁面上的按鈕,每次頁面被重新發送時,計數器都會增加。 另一個標籤控件顯示計數器中的值。
首先啟動Visual Studio,創建一個名稱為:ManagingState 的空網站專案,如下所示 -
添加一個新的窗體頁面 - ViewState.aspx,如下所示 -
ViewState.aspx 的代碼實現如下 -
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ViewState.aspx.cs" Inherits="ViewState" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>視圖狀態</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>視圖狀態示例</h3>
頁面計數器:
<asp:Label ID="lblCounter" runat="server" />
<asp:Button ID="btnIncrement" runat="server" Text="添加計數" onclick="btnIncrement_Click" />
</div>
</form>
</body>
</html>
後端實現的Default.aspx.cs 如下 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class ViewState : 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)
{
counter = counter + 1;
lblCounter.Text = counter.ToString();
}
protected void btnIncrement_Click(object sender, EventArgs e)
{
//counter = counter + 1;
lblCounter.Text = counter.ToString();
}
}
運行後,得到以下結果 -
控件狀態
控件狀態不能修改,直接訪問或禁用。
會話狀態
當用戶連接到ASP.NET網站時,會創建一個新的會話對象。 當會話狀態打開時,會為每個新請求創建一個新的會話狀態對象。 此會話狀態對象成為上下文的一部分,並通過該頁面可用。
會話狀態通常用於存儲應用程式數據,如庫存,供應商列表,客戶記錄或購物車。 它還可以保存關於用戶和他的偏好的資訊,並保持未決操作的軌跡。
會話使用120
位長度的SessionID
進行標識和跟蹤,SessionID
從客戶端傳遞到伺服器,並作為cookie
或修改後的URL返回。 SessionID
是全局唯一和隨機的。
會話狀態對象是從HttpSessionState
類創建的,該類定義了會話狀態項的集合。
HttpSessionState
類具有以下屬性:
編號 | 屬性 | 描述 |
---|---|---|
1 | SessionID |
唯一的會話識別字。 |
2 | Item(name) |
具有指定名稱的會話狀態項的值。這是HttpSessionState 類的默認屬性。 |
3 | Count |
會話狀態集合中的專案數量。 |
4 | TimeOut |
獲取並設置會話狀態提供程式終止會話之前請求之間允許的時間量(以分鐘為單位)。 |
HttpSessionState
類具有以下方法:
編號 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
將專案添加到會話狀態集合。 |
2 | Clear |
從會話狀態集合中刪除所有專案。 |
3 | Remove(name) |
從會話狀態集合中刪除指定的專案。 |
4 | RemoveAll |
從會話狀態集合中刪除所有的鍵和值。 |
5 | RemoveAt |
從會話狀態集合中刪除指定索引處的專案。 |
會話狀態對象是一個名稱-值對,用於存儲和檢索會話狀態對象的一些資訊。可以使用下麵的代碼來做同樣的事情:
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
上面的代碼只存儲Session字典對象中的字串,但是它可以存儲所有由基本數據類型組成的基本數據類型和數組,以及DataSet
,DataTable
,HashTable
和Image
對象, 定義的類從ISerializable
對象繼承。
示例
以下示例演示了存儲會話狀態的概念。 在頁面上有兩個按鈕,一個輸入字串的文本框和一個標籤來顯示上次會話存儲的文本。
在專案:ManagingState 上創建一個新的窗體檔:SessionState.aspx ,如下所示 -
參考以下代碼(SessionState.aspx) -
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SessionState.aspx.cs" Inherits="SessionState" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Session狀態</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="輸入一個字串:" 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="無動作按鈕" style="width:128px" />
</td>
<td style="width: 317px">
<asp:Button ID="btnstr" runat="server"
OnClick="btnstr_Click" Text="提交" />
</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>
在設計視圖中應該如下所示:
檔後端處理的代碼(SessionState.aspx.cs
)如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SessionState : 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狀態
ASP.NET應用程式是Web伺服器上單個虛擬目錄中的所有網頁,代碼和其他檔的集合。 資訊以應用程式狀態存儲時,所有用戶都可以使用。
為了提供應用程式狀態的使用,ASP.NET從HTTPApplicationState
類為每個應用程式創建一個應用程式狀態對象,並將此對象存儲在伺服器記憶體中。該對象由類檔global.asax
表示。
應用程式狀態主要用於存儲點擊計數器和其他統計數據,全局應用程式數據(如稅率,折扣率等),並保持用戶訪問該網站的軌跡。
HttpApplicationState
類具有以下屬性:
編號 | 屬性 | 描述 |
---|---|---|
1 | Item(name) |
具有指定名稱的應用程式狀態項的值。 這是HttpApplicationState 類的默認屬性。 |
2 | Count |
應用程式狀態集合中的專案數。 |
HttpApplicationState
類具有以下方法:
編號 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
將專案添加到應用程式狀態集合。 |
2 | Clear |
從應用程式狀態集合中刪除所有專案。 |
3 | Remove(name) |
從應用程式狀態集合中刪除指定的專案。 |
4 | RemoveAll |
從HttpApplicationState 集合中刪除所有對象。 |
5 | RemoveAt |
通過索引從集合中刪除HttpApplicationState 對象。 |
6 | Lock() |
鎖定應用程式狀態集合,以便只有當前用戶可以訪問它。 |
7 | Unlock() |
解鎖應用程式狀態收集,以便所有用戶都可以訪問它。 |
應用程式狀態數據通常通過為事件編寫處理程式來維護:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
以下代碼片段顯示了存儲應用程式狀態資訊的基本語法:
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.";
}