超文本傳輸協(xié)議(HTTP)是一種無(wú)狀態(tài)協(xié)議。當(dāng)客戶端從服務(wù)器斷開(kāi)連接時(shí),ASP.NET 引擎將丟棄頁(yè)面對(duì)象。這樣一來(lái),每個(gè) Web 應(yīng)用程序能夠擴(kuò)展到同時(shí)用于大量請(qǐng)求,但是不會(huì)耗盡服務(wù)器內(nèi)存。
然而,需要有一些技術(shù)來(lái)存儲(chǔ)各個(gè)請(qǐng)求之間的信息并在需要時(shí)取回。這個(gè)信息則稱為狀態(tài),即所有控件的當(dāng)前值和在當(dāng)前會(huì)話中當(dāng)前用戶使用的變量。
ASP.NET 管理四種狀態(tài):
視圖狀態(tài)是頁(yè)面及其所有控件的狀態(tài)。它通過(guò) ASP.NET 框架的反饋保持不變。
當(dāng)一個(gè)頁(yè)面被發(fā)送回客戶端,這些頁(yè)面變化的屬性及其控件是確定的,并存儲(chǔ)在名為 _VIEWSTATE 的一個(gè)隱藏輸入字段的值內(nèi)。當(dāng)頁(yè)面被再次回發(fā)時(shí),_VIEWSTATE 字段隨 HTTP 請(qǐng)求被發(fā)送到服務(wù)器。
視圖狀態(tài)可以對(duì)以下內(nèi)容啟用或者禁用:
它通過(guò)使用視圖狀態(tài)對(duì)象,該對(duì)象是由被一組視圖狀態(tài)項(xiàng)目定義的 StateBag 類別定義的。該 StateBag 是一種數(shù)據(jù)結(jié)構(gòu),包含屬性值對(duì)并被存儲(chǔ)為與對(duì)象相關(guān)聯(lián)的字符串。
StateBag 類具有以下屬性:
屬性 | 描述 |
---|---|
Item(name) | 具有指定名稱的視圖狀態(tài)的值,是 StateBag 的默認(rèn)屬性。 |
Count | 狀態(tài)集合中的項(xiàng)目名稱。 |
Keys | 集合中所有項(xiàng)目的密鑰集合。 |
Values | 集合中所有項(xiàng)目的值的集合。 |
StateBag 類具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 添加一個(gè)項(xiàng)目到視圖狀態(tài)集合,更新現(xiàn)有項(xiàng)目。 |
Clear | 移除集合中所有項(xiàng)目。 |
Equals(Object) | 確定指定的對(duì)象是否等于當(dāng)前對(duì)象。 |
Finalize | 允許釋放資源并執(zhí)行其他清理操作。 |
GetEnumerator | 返回存儲(chǔ)在 StateBag 對(duì)象中重復(fù)的 StateItem 對(duì)象的密鑰/值對(duì)的計(jì)數(shù)器。 |
GetType | 獲取當(dāng)前實(shí)例的類型。 |
IsItemDirty | 檢查存儲(chǔ)在 StateBag 對(duì)象以確認(rèn)其是否已被修改。 |
Remove(name) | 移除制定項(xiàng)目。 |
SetDirty | 設(shè)置 StateBag 對(duì)象的狀態(tài)以及每個(gè)由其包含的 StateItem 對(duì)象的 Dirty 屬性。 |
SetItemDirty | 為在 StateBag 對(duì)象中的指定 StateItem 對(duì)象設(shè)置 Dirty 屬性。 |
ToString | 返回代表狀態(tài)包對(duì)象的字符串。 |
以下實(shí)例說(shuō)明了存儲(chǔ)視圖狀態(tài)的字符串的概念。
讓我們保持一個(gè)計(jì)數(shù)器,通過(guò)點(diǎn)擊頁(yè)面上的一個(gè)按鈕,該計(jì)數(shù)器能夠在每次頁(yè)面被調(diào)回時(shí)遞增。標(biāo)簽控件顯示計(jì)數(shù)器的值。
標(biāo)記文件代碼如下所示:
<%@ 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>
該實(shí)例的后臺(tái)代碼文件如下所示:
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++;
}
}
它將會(huì)生成以下結(jié)果:
控制狀態(tài)不能被直接修改,存取或禁用。
當(dāng)用戶連接到 ASP.NET 網(wǎng)站,一個(gè)新的會(huì)話對(duì)象將被創(chuàng)建。當(dāng)會(huì)話狀態(tài)開(kāi)啟時(shí),新的會(huì)話狀態(tài)會(huì)為每一個(gè)新的請(qǐng)求而創(chuàng)建。這種會(huì)話狀態(tài)對(duì)象會(huì)成為運(yùn)行環(huán)境中的一部分并可通過(guò)頁(yè)面使用。
會(huì)話狀態(tài)通常用于存儲(chǔ)應(yīng)用程序數(shù)據(jù),比如詳細(xì)目錄,供應(yīng)商清單,客戶記錄或購(gòu)物車。它可以存儲(chǔ)用戶的信息及其偏好信息,并保存用戶未決定的路徑。
會(huì)話由 120 位的 SessionID 識(shí)別和跟蹤,從客戶端傳遞到服務(wù)器并且作為 cookie 或修改的 URL 回傳。SessionID 是全球唯一的,隨機(jī)的。
會(huì)話狀態(tài)對(duì)象由 HttpSessionState 類創(chuàng)建,它定義會(huì)話狀態(tài)項(xiàng)集合。
HttpSessionState 類具有以下屬性:
屬性 | 描述 |
---|---|
SessionID | 唯一的會(huì)話標(biāo)識(shí)符。 |
Item(name) | 具有指定名稱的會(huì)話狀態(tài)項(xiàng)的值,是 HttpSessionState 類的默認(rèn)屬性。 |
Count | 會(huì)話狀態(tài)集合中項(xiàng)的數(shù)量。 |
TimeOut | 獲取和設(shè)置時(shí)間量,幾分鐘內(nèi),在供應(yīng)商停止會(huì)話狀態(tài)前在請(qǐng)求間被允許。 |
HttpSessionState 類有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 添加新的項(xiàng)到會(huì)話狀態(tài)集合。 |
Clear | 移除會(huì)話狀態(tài)集合中所有項(xiàng)。 |
Remove(name) | 移除會(huì)話狀態(tài)集合中的指定項(xiàng)。 |
RemoveAll | 移除會(huì)話狀態(tài)集合中所有密鑰和值。 |
RemoveAt | 從會(huì)話狀態(tài)集合中刪除指定索引處的項(xiàng)。 |
會(huì)話狀態(tài)對(duì)象是一個(gè)名 - 值對(duì),它可以從會(huì)話狀態(tài)對(duì)象中存儲(chǔ)和檢索信息。同樣地,您可以使用以下代碼:
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
以上代碼只存儲(chǔ)在會(huì)話詞典對(duì)象中的字符串,但是,它可以存儲(chǔ)所有原始數(shù)據(jù)類型和由原始數(shù)據(jù)類型組成的陣列,DataSet, DataTable, HashTable, 和圖像對(duì)象,以及繼承 ISerializable 對(duì)象的任意用戶定義的類。
以下實(shí)例說(shuō)明了存儲(chǔ)會(huì)話狀態(tài)的概念。在頁(yè)面上有兩個(gè)按鈕:輸入字符串的文本框按鈕和顯示從最后一個(gè)會(huì)話中存儲(chǔ)的文本的標(biāo)簽按鈕。標(biāo)記文件代碼如下所示:
<%@ 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>
在設(shè)計(jì)視圖中應(yīng)有如下顯示:
后臺(tái)代碼如下:
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"];
}
}
執(zhí)行文件并觀察其如何運(yùn)行:
ASP.NET 應(yīng)用程序是在 Web 服務(wù)器上所有網(wǎng)頁(yè),代碼和單個(gè)虛擬目錄的其他文件的集合。當(dāng)信息被存儲(chǔ)在應(yīng)用程序狀態(tài),它可以供所有用戶使用。
為了提供應(yīng)用程序狀態(tài)的使用,ASP.NET 從 HttpApplicationState 類中為每個(gè)應(yīng)用程序創(chuàng)建一個(gè)應(yīng)用程序狀態(tài)對(duì)象,并將該對(duì)象存儲(chǔ)在服務(wù)器內(nèi)存中。該對(duì)象是由類文件 global.asax 表示。
應(yīng)用程序狀態(tài)主要被用于存儲(chǔ)計(jì)數(shù)器,其他統(tǒng)計(jì)數(shù)據(jù)及稅率,折扣率等所有應(yīng)用程序數(shù)據(jù),并存儲(chǔ)用戶訪問(wèn)網(wǎng)站的路徑。
HttpApplicationState 類具有以下屬性:
屬性 | 描述 |
---|---|
Item(name) | 具有指定名稱的應(yīng)用程序項(xiàng)的值,是 HttpApplicationState 的默認(rèn)屬性。 |
Count | 應(yīng)用程序狀態(tài)集合中項(xiàng)的數(shù)量。 |
HttpApplicationState 類具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 添加新的項(xiàng)目到應(yīng)用程序狀態(tài)集合。 |
Clear | 移除應(yīng)用程序狀態(tài)集合中的所有項(xiàng)。 |
Remove(name) | 移除應(yīng)用程序狀態(tài)集合中的指定項(xiàng)。 |
RemoveAll | 移除一個(gè) HttpApplicationState 集合中所有對(duì)象。 |
RemoveAt | 移除從由索引找到的集合中的一個(gè) HttpApplicationState 對(duì)象。 |
Lock() | 鎖定應(yīng)用程序狀態(tài)集合以便只有當(dāng)前用戶可以訪問(wèn)。 |
Unlock() | 解鎖應(yīng)用程序狀態(tài)集合以便所有用戶可以訪問(wèn)。 |
應(yīng)用程序狀態(tài)的數(shù)據(jù)通常是由為事件編寫的處理程序維護(hù):
以下代碼片段展示了用于存儲(chǔ)應(yīng)用程序狀態(tài)信息的基本語(yǔ)法:
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.";
}
更多建議: