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
類具有以下屬性:
編號
屬性
描述
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.";
}
易百教程移動端:請掃描本頁面底部(右側)二維碼並關注微信公衆號,回覆:"教程" 選擇相關教程閱讀或直接訪問:http://m.yiibai.com 。
上一篇:ASP.NET指令 下一篇:ASP.NET驗證器
加QQ羣啦,易百教程官方技術學習羣
QQ羣名稱
羣號
人數
免費
等級
羣介紹
JAVA技術
227270512
2000
否
LV5
Java基礎,JSP(Servlet),JAVA框架,Java高併發架構,Maven等等
MySQL/SQL
418407075
2000
否
LV5
SQL基礎,MySQL基礎,MySQL存儲過程,視圖,觸發器等等
大數據開發
655154550
2000
否
LV5
Spark,zookeeper,kafka,CDH,hive,fulme,hbase等Hadoop雲計算生態圈技術
Python技術
287904175
2000
否
LV5
Python編程,Python Web,Python大數據,Python爬蟲,自然語言處理等
Linux技術
479429477
2000
是
LV1
Redhat/Centos,Ubuntu,Shell,運維,監控等技術
PHP/Web開發者
460153241
1000
是
LV0
PHP基礎,PHP高級,網站優化/架構,JS,HTML,JQuery,前端等Web開發技術
人工智能
456236082
1000
是
LV0
人工智能,深度學習,算法等技術
Oracle數據庫
175248146
1000
是
LV0
SQL基礎,Oracle基礎,Oracle存儲過程,視圖,觸發器等等
Android開發
159629185
1000
是
LV0
Android開發,Android Studio,Kotlin,Dagger等技術
微軟技術
579821706
1000
是
LV0
C#,ASP.Net,VB.Net,ADO.Net,SQL Server,VBA,Excel等技術