使用 Visual C# .NET 在 ASP.NET 中執行片段快取

本文說明如何使用 Visual C# .NET 在 ASP.NET 中執行片段快取。

原始產品版本: Microsoft ASP.NET
原始 KB 編號: 308378

摘要

本文示範如何在 ASP.NET 中實作片段快取。 片段快取實際上不會直接快取 Web Form 的代碼段;片段快取是指在 Web Form 內 (.ascx) 個別使用者控件的快取。 每個使用者控制項都可以有獨立的快取持續時間,以及如何套用快取行為的實作。 本文中的範例程式代碼說明如何達成這項功能。

當您只需要快取頁面的子集時,片段快取會很有用。 導覽列、頁首和頁尾是片段快取的良好候選專案。

需求

  • Windows 2000
  • Internet Information Server (IIS)
  • .NET Framework
  • ASP.NET

使用 C# .NET 建立 ASP.NET Web 應用程式

下列步驟示範如何建立名為 FragmentCache 的新 ASP.NET Web 應用程式。

  1. 啟 Visual Studio .NET

  2. [檔案] 功能表中,按一下 [新增],然後按一下 [專案]

  3. 在 [新增專案] 對話框中,按兩下 [項目類型] 底下的 [Visual C# 專案],然後按兩下 [範本] 底下的 [ASP.NET Web 應用程式]。

  4. 在 [ 名稱] 方 塊中,輸入 FragmentCache。 在 [ 位置] 方 塊中,選取適當的伺服器。 如果您使用本地伺服器,您可以將伺服器名稱保留為 http://localhost

建立使用者控制件

本節提供您將在本文中使用之每個使用者控件的範例程式代碼和說明。 您可以將範例程式代碼複製並貼到 associated.ascx 檔案和程式代碼後置頁面,如所述。

使用者控件 1 (FragmentCtrl1.ascx)

下列使用者控件 FragmentCtrl1.ascx 很簡單。 FragmentCtrl1.ascx 會寫出專案快取項目發生的時間。 如同針對本文建立的所有控件,會為控件提供基本描述,讓您在稍後章節的運行時間更容易區分設定和相關聯的行為。

  1. Visual Studio .NET 中,建立新的使用者控件,如下所示:

    1. 方案總管 中,以滑鼠右鍵按兩下項目節點,指向[新增],然後按兩下[新增Web使用者控件]
    2. 將控件命名為 FragmentCtrl1.ascx,然後按兩下 [ 開啟]
  2. 請確定已選取 [ 設計] 索引 標籤。 從工具箱的 [Web Form] 區段中按兩下並拖曳 Web Form Label 控件,然後將 [捲標] 控件放到頁面上。

  3. 按兩下 [標籤] 控制件。 在 Visual Studio .NET 集成開發環境的 [屬性] 窗格中, (IDE) ,在 [標識符] 屬性中輸入 CacheEntryTime,並將 Text 屬性保留空白。

  4. 切換至 HTML 檢視 ,並將下列指示詞 @ OutputCache 新增至頁面頂端:

    <%@ OutputCache Duration="40" VaryByParam="none"%>
    
  5. 以滑鼠右鍵按兩下 .ascx 檔案,然後按兩下 [ 檢視程式代碼 ] 以顯示程式代碼後置頁面來源。

  6. 將下列程式代碼新增至 Page_Load 事件,以設定 CacheEntryTime 標籤的 Text 屬性:

    private void Page_Load(object sender, System.EventArgs e)
    {
        CacheEntryTime.Text ="FragmentCtrl1: " + DateTime.Now.TimeOfDay.ToString();
    }
    

使用者控件 2 (FragmentCtrl2.ascx)

雖然您可以直接使用不同的快取持續時間建立另一個版本的第一個控件,以顯示多個使用者控件在相同頁面中具有獨立行為的方式,但本節讓第二個控件 FragmentCtrl2.ascx 更有趣。 FragmentCtrl2.ascx 用來引進 VaryByControl 屬性。 VaryByControl 允許根據指定控件的值來建立不同的快取專案。 下一節會在運行時間更清楚這項功能。

  1. Visual Studio .NET 中,建立新的使用者控件,如下所示:

    1. 方案總管 中,以滑鼠右鍵按兩下項目節點,指向[新增],然後按兩下[新增Web使用者控件]
    2. 將控件命名為 FragmentCtrl2.ascx,然後按兩下 [ 開啟]
  2. 請確定已選取 [ 設計] 索引 標籤。 從工具箱的 [Web Form] 區段中按兩下並拖曳 Web Form Label 控件,然後將 [捲標] 控件放到頁面上。

  3. 按兩下 [標籤] 控制件。 在 [屬性] 窗格的 [標識符] 屬性中輸入 CacheEntryTime,並將 Text 屬性保留空白。

  4. 將游標直接放在標籤控件後面,然後按 ENTER 鍵移至頁面中的下一行。

  5. 從工具箱的 [Web Form] 區段中按兩下並拖曳 Web Form RadioButtonList 控件,然後將它放到頁面上。 RadioButtonList 控件應該會單獨出現在標籤上後面的行上。

  6. 按下 RadioButtonList 控制項。 在 [屬性] 窗格中,於ID屬性中輸入 MyRadioButtonList

  7. 在 [屬性] 窗格中,找出 MyRadioButtonList 控件的 Items 屬性,按兩下 [集合],然後按兩下 [集合] 旁的省略號 (...) 按鈕。

  8. [ListItem 集合] 編輯器 視窗中,新增 ListItem 成員,如下所示:

    1. [成員] 底下,按兩下 [ 新增]
    2. [ListItem 屬性] 區段中,將 [文字 ] 和 [值] 設定為 [ ],並將 [ 選取 ] 設定為 [True]
    3. 在 [ 成員] 下,再次按兩下 [新增 ]。
    4. [ListItem 屬性] 區段中,將 [文字 ] 和 [值] 設定為 [否],並將 [ 選取 ] 設定為 [False]
    5. [成員] 底下,最後按兩下 [ 新增 一次]。
    6. [ListItem 屬性] 區段中,將 [文字 ] 和 [值] 設定為 [可能],並將 [ 選取 ] 設定為 [False]
    7. 按兩下 [確定] 傳回設計檢視中的 .ascx 檔案。 請注意,RadioButtonList 控件內會出現三個單選按鈕: 可能
  9. 將游標直接放在 RadioButtonList 控件後面,然後按 ENTER 鍵移至頁面中的下一行。

  10. 從工具箱的 [Web Form] 區段中按兩下並拖曳 [Web Form Button] 控件,然後將它放到頁面上。 Button 控件應該會單獨出現在 RadioButtonList 控件後面的行上。

  11. 按兩下 [按鈕] 控制件。 在 [ 屬性]格中,[文字 ] 屬性中輸入 Submit。

  12. 切換至 HTML 檢視 ,並將下列指示詞 @OutputCache 新增至頁面頂端:

    <%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="MyRadioButtonList"%>
    
  13. 以滑鼠右鍵按兩下 .ascx 檔案,然後按兩下 [ 檢視程式代碼 ] 以顯示程式代碼後置頁面來源。

  14. 將下列程式代碼新增至 Page_Load 事件,以設定 CacheEntryTime 標籤的 Text 屬性:

    private void Page_Load(object sender, System.EventArgs e)
    {
        CacheEntryTime.Text = "FragmentCtrl2: " + DateTime.Now.TimeOfDay.ToString();
    }
    

建立 Web Form 以包含使用者控制件

您現在可以建立 Web Form (.aspx) ,以包含新開發的使用者控件。 若要建立 Web 窗體,請遵循下列步驟:

  1. Visual Studio .NET 中將名為 FragmentCaching.aspx 的新 Web Form 新增至您的專案,如下所示:

    1. 方案總管 中,以滑鼠右鍵按兩下項目節點,指向[新增],然後按兩下[新增Web窗體]
    2. 將 Web Form 命名FragmentCaching.aspx,然後按兩下 [ 開啟]
  2. 請確定已選取 [ 設計] 索引 標籤。 從工具箱的 [Web Form] 區段中按兩下並拖曳 [Web Form Label] 控制件,然後將它放到頁面上。

  3. 按兩下 [標籤] 控制件。 在 [屬性] 窗格的 [標識符] 屬性中輸入 Time,並將 Text 屬性保留空白。

  4. 將游標直接放在標籤控件後面,然後按 ENTER 鍵移至頁面中的下一行。

  5. 曳 FragmentCtrl1.ascx,然後將它放到 Web Form 上,讓它位於一行上的卷標控件之後。 將游標直接放在控件後面,然後按 ENTER 鍵移至頁面中的下一行。

  6. 曳 FragmentCtrl2.ascx,然後將它放到 Web Form 上,讓它位於某一行的 FragmentCtrl1.ascx 之後。

  7. HTML 檢視 中,Web Form 看起來應該類似下列程式代碼:

    <%@ Page language ="c#" Codebehind="FragmentCaching.aspx.cs"
       AutoEventWireup="false" Inherits="FragmentCache.FragmentCaching" %>
    <%@ Register TagPrefix="uc1" TagName="FragmentCtrl1" Src="FragmentCtrl1.ascx" %>
    <%@ Register TagPrefix="uc1" TagName="FragmentCtrl2" Src="FragmentCtrl2.ascx" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
       <HEAD>
          <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
          <meta name="CODE_LANGUAGE" Content="C#">
          <meta name="vs_defaultClientScript" content="JavaScript (ECMAScript)">
          <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
       </HEAD>
       <body>
          <form id="FragmentCaching" method="post" runat="server">
             <P>
                WebForm Time:
                <asp:Label id="Time" runat="server" ForeColor="Blue"></asp:Label>
             </P>
             <P>
                <uc1:FragmentCtrl1 id="FragmentCtrl11" runat="server">
                </uc1:FragmentCtrl1>
             </P>
             <P>
                <uc1:FragmentCtrl2 id="FragmentCtrl21" runat="server">
                </uc1:FragmentCtrl2>
             </P>
          </form>
       </body>
    </HTML>
    

    注意事項

    請確定控制件位於

  8. 以滑鼠右鍵按兩下 .aspx 檔案,然後按兩下 [ 檢視程式代碼 ] 以顯示程式代碼後置頁面來源。

  9. 將下列程式代碼新增至 Page_Load 事件,以設定 Time 標籤的 Text 屬性:

    private void Page_Load(object sender, System.EventArgs e)
    {
        Time.Text = "WebFormTime: " + DateTime.Now.TimeOfDay.ToString();
    }
    
  10. 從 [ 檔案] 功能表中,單擊 [ 全部儲存] 以儲存使用者控件、Web 窗體和其他相關聯的項目檔。

  11. Visual Studio .NET 集成開發環境中的 [置] 功能表 (IDE) ,單擊 [置] 以建置專案。

執行範例

本節示範如何在運行時間檢視程式代碼以見證快取行為,然後簡短描述程式代碼執行方式的原因。

  1. Visual Studio .NET IDE 方案總管 中,以滑鼠右鍵按兩下 [FragmentCaching.aspx Web Form],然後按兩下 [在瀏覽器中檢視] 以執行程式碼。

  2. 在瀏覽器中出現頁面之後,以滑鼠右鍵按下頁面,然後按兩下 [ 重新 整理] 重新整理頁面。 如果您在 Visual Studio .NET IDE 外部的瀏覽器中檢視頁面,也可以按 F5 鍵重新整理頁面。

    注意事項

    Web Form 上的時間已更新,但使用者控件仍會顯示建立其相關快取項目的時間。

  3. 在第二個控件中,按兩下 [ 提交]。 請注意,控件會顯示更新的時間。 這是為了回應參考 RadioButtonList 控制項之使用者控制件的 VaryByControl 屬性設定。

  4. 按兩下 [否],然後再按兩下 [ 提交 ]。

    注意事項

    使用者控件的顯示器中的時間會再次更新。 這是因為會根據這個 [ 沒有 值] 設定,為控件建立新的快取專案。 重複此步驟,但 [可能 ] 選項除外。 您會看到相同的行為。

  5. 按兩下 [是],然後再按兩下 [ 提交 ]。 使用 [否 ] 和 [ 可能 ] 選項重複此作業。

    系統會快取控件的這些選取專案,並顯示先前的快取項目時間。 如果您繼續按兩下 [ 提交 超過 @ OutputCache 指示詞的持續時間] 設定,則會針對 RadioButtonList 控件的每個特定值選取專案更新使用者控件的時間。

注意事項

本文的目標不是涵蓋片段快取的所有可能設定和案例。

疑難排解

  • 請勿嘗試以程式設計方式操作輸出快取的使用者控制件。 這是因為只有在快取項目發生之前第一次執行控件時,才會動態建立控件。 輸出快取會滿足所有其他要求,直到控件過期為止。

  • 如果裝載使用者控件的 Web Form 的輸出快取持續時間超過使用者控件的持續時間,Web Form 的設定會決定控件的快取行為。