ASP.NET 管理狀態(tài)

2022-06-27 15:42 更新

管理狀態(tài)

超文本傳輸協(xié)議(HTTP)是一種無狀態(tài)協(xié)議。當客戶端從服務器斷開連接時,ASP.NET 引擎將丟棄頁面對象。這樣一來,每個 Web 應用程序能夠擴展到同時用于大量請求,但是不會耗盡服務器內(nèi)存。

然而,需要有一些技術來存儲各個請求之間的信息并在需要時取回。這個信息則稱為狀態(tài),即所有控件的當前值和在當前會話中當前用戶使用的變量。

ASP.NET 管理四種狀態(tài):

  • 視圖狀態(tài)
  • 控制狀態(tài)
  • 會話狀態(tài)
  • 應用程序狀態(tài)

視圖狀態(tài)

視圖狀態(tài)是頁面及其所有控件的狀態(tài)。它通過 ASP.NET 框架的反饋保持不變。

當一個頁面被發(fā)送回客戶端,這些頁面變化的屬性及其控件是確定的,并存儲在名為 _VIEWSTATE 的一個隱藏輸入字段的值內(nèi)。當頁面被再次回發(fā)時,_VIEWSTATE 字段隨 HTTP 請求被發(fā)送到服務器。

視圖狀態(tài)可以對以下內(nèi)容啟用或者禁用:

  • 整個應用程序:設置 web.config 文件中 部分的 EnableViewState 屬性。
  • 一個頁面:設置頁面指令的 EnableViewState 屬性為 <%@ Page Language="C#" EnableViewState="false" %>
  • 一個控件:設置控件 .EnableViewState 屬性。

它通過使用視圖狀態(tài)對象,該對象是由被一組視圖狀態(tài)項目定義的 StateBag 類別定義的。該 StateBag 是一種數(shù)據(jù)結(jié)構(gòu),包含屬性值對并被存儲為與對象相關聯(lián)的字符串。

StateBag 類具有以下屬性:

屬性描述
Item(name)具有指定名稱的視圖狀態(tài)的值,是 StateBag 的默認屬性。
Count狀態(tài)集合中的項目名稱。
Keys集合中所有項目的密鑰集合。
Values集合中所有項目的值的集合。

StateBag 類具有以下方法:

方法描述
Add(name, value)添加一個項目到視圖狀態(tài)集合,更新現(xiàn)有項目。
Clear移除集合中所有項目。
Equals(Object)確定指定的對象是否等于當前對象。
Finalize允許釋放資源并執(zhí)行其他清理操作。
GetEnumerator返回存儲在 StateBag 對象中重復的 StateItem 對象的密鑰/值對的計數(shù)器。
GetType獲取當前實例的類型。
IsItemDirty檢查存儲在 StateBag 對象以確認其是否已被修改。
Remove(name)移除制定項目。
SetDirty設置 StateBag 對象的狀態(tài)以及每個由其包含的 StateItem 對象的 Dirty 屬性。
SetItemDirty為在 StateBag 對象中的指定 StateItem 對象設置 Dirty 屬性。
ToString返回代表狀態(tài)包對象的字符串。

實例

以下實例說明了存儲視圖狀態(tài)的字符串的概念。

讓我們保持一個計數(shù)器,通過點擊頁面上的一個按鈕,該計數(shù)器能夠在每次頁面被調(diào)回時遞增。標簽控件顯示計數(shù)器的值。

標記文件代碼如下所示:

<%@ 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++;
   }
}

它將會生成以下結(jié)果:

image

控制狀態(tài)

控制狀態(tài)不能被直接修改,存取或禁用。

會話狀態(tài)

當用戶連接到 ASP.NET 網(wǎng)站,一個新的會話對象將被創(chuàng)建。當會話狀態(tài)開啟時,新的會話狀態(tài)會為每一個新的請求而創(chuàng)建。這種會話狀態(tài)對象會成為運行環(huán)境中的一部分并可通過頁面使用。

會話狀態(tài)通常用于存儲應用程序數(shù)據(jù),比如詳細目錄,供應商清單,客戶記錄或購物車。它可以存儲用戶的信息及其偏好信息,并保存用戶未決定的路徑。

會話由 120 位的 SessionID 識別和跟蹤,從客戶端傳遞到服務器并且作為 cookie 或修改的 URL 回傳。SessionID 是全球唯一的,隨機的。

會話狀態(tài)對象由 HttpSessionState 類創(chuàng)建,它定義會話狀態(tài)項集合。

HttpSessionState 類具有以下屬性:

屬性描述
SessionID唯一的會話標識符。
Item(name)具有指定名稱的會話狀態(tài)項的值,是 HttpSessionState 類的默認屬性。
Count會話狀態(tài)集合中項的數(shù)量。
TimeOut獲取和設置時間量,幾分鐘內(nèi),在供應商停止會話狀態(tài)前在請求間被允許。

HttpSessionState 類有以下方法:

方法描述
Add(name, value)添加新的項到會話狀態(tài)集合。
Clear移除會話狀態(tài)集合中所有項。
Remove(name)移除會話狀態(tài)集合中的指定項。
RemoveAll移除會話狀態(tài)集合中所有密鑰和值。
RemoveAt從會話狀態(tài)集合中刪除指定索引處的項。

會話狀態(tài)對象是一個名 - 值對,它可以從會話狀態(tài)對象中存儲和檢索信息。同樣地,您可以使用以下代碼:

void StoreSessionInfo()
{
   String fromuser = TextBox1.Text;
   Session["fromuser"] = fromuser;
}

void RetrieveSessionInfo()
{
   String fromuser = Session["fromuser"];
   Label1.Text = fromuser;
}

以上代碼只存儲在會話詞典對象中的字符串,但是,它可以存儲所有原始數(shù)據(jù)類型和由原始數(shù)據(jù)類型組成的陣列,DataSet, DataTable, HashTable, 和圖像對象,以及繼承 ISerializable 對象的任意用戶定義的類。

實例

以下實例說明了存儲會話狀態(tài)的概念。在頁面上有兩個按鈕:輸入字符串的文本框按鈕和顯示從最后一個會話中存儲的文本的標簽按鈕。標記文件代碼如下所示:

<%@ 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>
            &nbsp; &nbsp; &nbsp;

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

在設計視圖中應有如下顯示:

image

后臺代碼如下:

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í)行文件并觀察其如何運行:

image

應用程序狀態(tài)

ASP.NET 應用程序是在 Web 服務器上所有網(wǎng)頁,代碼和單個虛擬目錄的其他文件的集合。當信息被存儲在應用程序狀態(tài),它可以供所有用戶使用。

為了提供應用程序狀態(tài)的使用,ASP.NET 從 HttpApplicationState 類中為每個應用程序創(chuàng)建一個應用程序狀態(tài)對象,并將該對象存儲在服務器內(nèi)存中。該對象是由類文件 global.asax 表示。

應用程序狀態(tài)主要被用于存儲計數(shù)器,其他統(tǒng)計數(shù)據(jù)及稅率,折扣率等所有應用程序數(shù)據(jù),并存儲用戶訪問網(wǎng)站的路徑。

HttpApplicationState 類具有以下屬性:

屬性描述
Item(name)具有指定名稱的應用程序項的值,是 HttpApplicationState 的默認屬性。
Count應用程序狀態(tài)集合中項的數(shù)量。

HttpApplicationState 類具有以下方法:

方法描述
Add(name, value)添加新的項目到應用程序狀態(tài)集合。
Clear移除應用程序狀態(tài)集合中的所有項。
Remove(name)移除應用程序狀態(tài)集合中的指定項。
RemoveAll移除一個 HttpApplicationState 集合中所有對象。
RemoveAt移除從由索引找到的集合中的一個 HttpApplicationState 對象。
Lock()鎖定應用程序狀態(tài)集合以便只有當前用戶可以訪問。
Unlock()解鎖應用程序狀態(tài)集合以便所有用戶可以訪問。

應用程序狀態(tài)的數(shù)據(jù)通常是由為事件編寫的處理程序維護:

  • 應用程序開啟
  • 應用程序結(jié)束
  • 應用程序錯誤
  • 會話開始
  • 會話結(jié)束

以下代碼片段展示了用于存儲應用程序狀態(tài)信息的基本語法:

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.";
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號