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 的空網站項目,如下所示 -

ASP.NET管理狀態

添加一個新的窗體頁面 - ViewState.aspx,如下所示 -

ASP.NET管理狀態

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管理狀態

控件狀態

控件狀態不能修改,直接訪問或禁用。

會話狀態

當用戶連接到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字典對象中的字符串,但是它可以存儲所有由基本數據類型組成的基本數據類型和數組,以及DataSetDataTableHashTableImage對象, 定義的類從ISerializable對象繼承。

示例

以下示例演示了存儲會話狀態的概念。 在頁面上有兩個按鈕,一個輸入字符串的文本框和一個標籤來顯示上次會話存儲的文本。

在項目:ManagingState 上創建一個新的窗體文件:SessionState.aspx ,如下所示 -

ASP.NET管理狀態

參考以下代碼(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>
            &nbsp; &nbsp; &nbsp;

            <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>

在設計視圖中應該如下所示:

ASP.NET管理狀態

文件後端處理的代碼(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"];
    }
}

執行該文件並觀察其結果和工作原理:

ASP.NET管理狀態

 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等技術