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字典對象中的字串,但是它可以存儲所有由基本數據類型組成的基本數據類型和數組,以及DataSetDataTableHashTableImage對象, 定義的類從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>
            &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>

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

檔後端處理的代碼(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.";
}

上一篇: ASP.NET指令 下一篇: ASP.NET驗證器