鍍金池/ 教程/ C#/ 管理狀態(tài)
調(diào)試
管理狀態(tài)
Panel 控件
Web 服務(wù)
語言集成查詢
數(shù)據(jù)源
基礎(chǔ)控件
廣告輪轉(zhuǎn)器
服務(wù)器端
服務(wù)器控件
ADO.NET
多線程
HTML 服務(wù)器
生命周期
Ajax 控制
客戶端
異常處理
環(huán)境設(shè)置
部署
個性化
驗證器
多視圖
日歷
文件上傳
ASP.NET - 數(shù)據(jù)綁定
數(shù)據(jù)庫存取
實例
自定義控件
簡介
配置
數(shù)據(jù)緩存
安全性
指令
事件處理

管理狀態(tài)

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

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

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

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

視圖狀態(tài)

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

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

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

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

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

StateBag 類具有以下屬性:

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

StateBag 類具有以下方法:

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

實例

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

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

該實例的后臺代碼文件如下所示:

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é)果:

http://wiki.jikexueyuan.com/project/asp-net/images/view_state_demo.jpg" alt="image" />

控制狀態(tài)

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

會話狀態(tài)

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

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

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

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

HttpSessionState 類具有以下屬性:

屬性 描述
SessionID 唯一的會話標(biāo)識符。
Item(name) 具有指定名稱的會話狀態(tài)項的值,是 HttpSessionState 類的默認(rèn)屬性。
Count 會話狀態(tài)集合中項的數(shù)量。
TimeOut 獲取和設(shè)置時間量,幾分鐘內(nèi),在供應(yīng)商停止會話狀態(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)的概念。在頁面上有兩個按鈕:輸入字符串的文本框按鈕和顯示從最后一個會話中存儲的文本的標(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>
            &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>

在設(shè)計視圖中應(yīng)有如下顯示:

http://wiki.jikexueyuan.com/project/asp-net/images/session_design_view.jpg" alt="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í)行文件并觀察其如何運行:

http://wiki.jikexueyuan.com/project/asp-net/images/session_run_view.jpg" alt="image" />

應(yīng)用程序狀態(tài)

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

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

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

HttpApplicationState 類具有以下屬性:

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

HttpApplicationState 類具有以下方法:

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

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

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

以下代碼片段展示了用于存儲應(yīng)用程序狀態(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.";
}
上一篇:基礎(chǔ)控件下一篇:事件處理