- ASP.NET 教程
- ASP.NET - 首頁
- ASP.NET - 簡介
- ASP.NET - 環境
- ASP.NET - 生命週期
- ASP.NET - 第一個示例
- ASP.NET - 事件處理
- ASP.NET - 伺服器端
- ASP.NET - 伺服器控制元件
- ASP.NET - HTML伺服器控制元件
- ASP.NET - 客戶端
- ASP.NET - 基本控制元件
- ASP.NET - 指令
- ASP.NET - 狀態管理
- ASP.NET - 驗證器
- ASP.NET - 資料庫訪問
- ASP.NET - ADO.NET
- ASP.NET - 檔案上傳
- ASP.NET - 廣告輪播
- ASP.NET - 日曆控制元件
- ASP.NET - 多檢視
- ASP.NET - 面板控制元件
- ASP.NET - AJAX 控制元件
- ASP.NET - 資料來源
- ASP.NET - 資料繫結
- ASP.NET - 自定義控制元件
- ASP.NET - 個性化設定
- ASP.NET - 錯誤處理
- ASP.NET - 除錯
- ASP.NET - LINQ
- ASP.NET - 安全性
- ASP.NET - 資料快取
- ASP.NET - Web 服務
- ASP.NET - 多執行緒
- ASP.NET - 配置
- ASP.NET - 部署
- ASP.NET 資源
- ASP.NET - 快速指南
- ASP.NET - 有用資源
- ASP.NET - 討論
ASP.NET - 狀態管理
超文字傳輸協議 (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 類具有以下屬性:
| 屬性 | 描述 |
|---|---|
| Item(name) | 具有指定名稱的檢視狀態項的值。這是 StateBag 類的預設屬性。 |
| Count | 檢視狀態集合中的專案數。 |
| Keys | 集合中所有專案的鍵的集合。 |
| Values | 集合中所有專案的值的集合。 |
StateBag 類具有以下方法:
| 方法 | 描述 |
|---|---|
| Add(name, value) | 向檢視狀態集合新增項,並更新現有項。 |
| Clear | 刪除集合中的所有項。 |
| Equals(Object) | 確定指定的物件是否等於當前物件。 |
| Finalize | 允許它釋放資源並執行其他清理操作。 |
| GetEnumerator | 返回一個列舉器,該列舉器迭代儲存在 StateBag 物件中的所有 StateItem 物件的鍵/值對。 |
| GetType | 獲取當前例項的型別。 |
| IsItemDirty | 檢查儲存在 StateBag 物件中的 StateItem 物件以評估它是否已修改。 |
| 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 進行標識和跟蹤,該 ID 以 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;
}
以上程式碼僅在 Session 字典物件中儲存字串,但是,它可以儲存所有原始資料型別和由原始資料型別組成的陣列,以及 DataSet、DataTable、HashTable 和 Image 物件,以及任何從 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 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"];
}
}
執行檔案並觀察其工作方式。
應用程式狀態
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() | 解鎖應用程式狀態集合,以便所有使用者都可以訪問它。 |
應用程式狀態資料通常透過為事件編寫處理程式來維護:
- 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.";
}