快取使用者控制項輸出的多個版本
更新:2007 年 11 月
您不僅可變更輸出快取的網頁版本,還可輸出網頁中具有使用者控制項的快取區域。若要進行這項作業,您可以藉由下列方法來改變使用者控制項輸出:變更控制項名稱和 GET 查詢字串、表單 POST 參數值,或僅變更參數值的輸出。您也可以在包含使用者控制項的 .aspx 檔案中,將使用者控制項宣告多次,以快取網頁上使用者控制項的多個版本。不管是否為使用者控制項指定輸出快取,都可以將這些技巧用於 .ascx 檔案中的 @ OutputCache 指示詞,或在程式碼後置 (Code-Behind) 類別 (Class) 中開發使用者控制項時,將這些技巧用於 PartialCachingAttribute 屬性 (Attribute)。
使用者控制項的 @ OutputCache 指示詞支援四個屬性:VaryByParam、VaryByCustom、VaryByControl 和 Shared。PartialCachingAttribute 類別包括四個參數:VaryByParams、VaryByControls、VaryByCustom 和 Shared,這些參數可讓您將屬性加入程式碼後置類別的使用者控制項時,使用相同的技巧。
在第一次要求包含具有輸出快取設定之使用者控制項的 ASP.NET 網頁時,控制項輸出的執行個體就會儲存到記憶體中。根據預設,每個包含相同使用者控制項的網頁,將會在被要求時把控制項輸出的另一個執行個體加入記憶體。
例如,如果您建立名為 Sample.ascx 的使用者控制項且其中包含輸出快取設定,並將 Sample.ascx 加入應用程式內 25 頁的 ASP.NET 網頁,則至少有 25 份的 Sample.ascx 版本會儲存於輸出快取中。此外,如果您使用 VaryByControl、VaryByCustom 或 VaryByParam 屬性修改使用者控制項的快取行為,則快取中可能有更多版本的使用者控制項輸出。例如,假設您在使用者控制項中包含 TextBox Web 伺服器控制項,並將其 ID 屬性設定為 MyTextBox。如果將 VaryByControl 屬性設定為 MyTextBox,對於 MyTextBox 控制項接收的每個值,快取中都會儲存使用者控制項輸出的版本。
如果在相同應用程式的多頁中使用一樣的使用者控制項,您可以將使用者控制項之 @ OutputCache 指示詞的 Shared 屬性 (Attribute) 設為 true,或將控制項之 PartialCachingAttribute 屬性 (Attribute) 上的 Shared 屬性 (Property) 設為 true,即可節省記憶體。這表示每個網頁將會存取相同的使用者控制項輸出執行個體。在一般使用和經常快取的使用者控制項上使用 Shared 屬性,可以節省相當大的記憶體。
將使用者控制項輸出加入至輸出快取,與將網頁輸出加入至輸出快取,其實有很大的不同。雖然這兩者的輸出快取都支援使用 GET 查詢字串和表單 POST 參數來建立並快取輸出多個版本,但使用者控制項不支援根據 HTTP 標頭的快取。
您可使用以下四項技巧變更輸出快取使用者控制項:
您可以使用 VaryByParam 屬性 (Attribute) 或 PartialCachingAttribute 類別的 VaryByParams 屬性 (Property),這個類別所提供的功能就和為網頁輸出快取提供的功能一樣。您可以將這兩者設定為任何字串,但是需要讓這些字串與所建立的使用者控制項相關聯的 GET 查詢字串或表單 POST 參數相等。
您可以使用 VaryByControl 屬性 (Attribute) 或 PartialCachingAttribute 類別的 VaryByControls 屬性 (Property),根據使用者控制項所包含之 ASP.NET 伺服器控制項的 ID 屬性 (Property),變更輸出快取的使用者控制項。
您可以使用 VaryByCustom 屬性 (Attribute) 或 PartialCachingAttribute 類別的 VaryByCustom 屬性 (Property),來定義您要據以變更快取使用者控制項輸出之自訂字串的程式碼。這個方式與變更網頁輸出快取的 VaryByControl 屬性技巧相同。如需詳細資訊,請參閱 HOW TO:使用自訂字串快取頁面的多個版本。
您可以在 ASP.NET 網頁中包含使用者控制項的多個執行個體。除非將 @ OutputCache 指示詞的 Shared 屬性設為 true,否則將快取控制項每個執行個體的輸出。
如需每個主題的詳細資訊,請參閱 HOW TO:根據參數快取使用者控制項的多個版本和 HOW TO:使用宣告式屬性快取使用者控制項的多個版本。