使用@ OutputCache指令
控件緩存與頁面輸出緩存的@ OutputCache指令既有相似之處,又有不同的方面。二者的***同點在於它們的設置方法基本相同,都是文件頂部設置包含屬性的@ OutputCache指令字符串。不同點包括以下兩個方面:壹是控件緩存的@ OutputCache指令設置在用戶控件文件中,而頁面輸出緩存的@ OutputCache設置在普通ASP.NET文件中。二是控件緩存的@ OutputCache指令只能設置6個屬性,Duration、Shared、SqlDependency、VaryByControl、VaryByCustom和VaryByParam。而在頁面輸出緩存的@ OutputCache指令字符串中設置的屬性多達10個。以上是設置控件緩存時需要註意的問題。下面列舉了壹些利用@ OutputCache指令設置控件緩存的示例,其中重點說明了VaryByParam和VaryByControl等屬性應用。
用戶控件中的@ OutputCache指令設置源代碼
<%@ OutputCache Duration="120" VaryByParam="CategoryID;SelectedID"%>
以上代碼設置用戶控件緩存有效期時間是120秒,並且允許使用CategoryID和SelectedID參數來改變緩存。通過VaryByParam屬性設置,在服務器緩存中可能存儲多個用戶控件的實例。例如,對於壹個包含用戶控件的頁面,可能存在如下的URL鏈接。
包含用戶控件的頁面的URL鏈接
http://localhost/mypage.aspx?categoryid=foo&selectedid=0
http://localhost/mypage.aspx?categoryid=foo&selectedid=1
當請求如上URL地址的頁面時,由於控件中@ OutputCache指令的設置,尤其是屬性VaryByParam的設置,那麽在服務器緩存中就會存儲兩個版本的用戶控件緩存實例。
控件緩存設置除了支持以上所述VaryByParam屬性外,還支持VaryByControl屬性。VaryByParam屬性基於使用POST或者GET方式發送的名稱/值對來改變緩存,而VaryByControl屬性通過用戶控件文件中包含的服務器控件來改變緩存。下面是VaryByControl屬性的應用示例代碼。
用戶控件中的@ OutputCache指令設置源代碼
<%@ OutputCache Duration="120" VaryByParam="none" VaryByControl="Category" %>
以上代碼設置緩存有效期是120秒,並且頁面不隨任何GET或POST參數改變(即使不使用VaryByParam屬性,但是仍然需要在@ OutputControl指令中顯式聲明該屬性)。如果用戶控件中包含ID屬性為“Category”的服務器控件(例如下拉框控件),那麽緩存將根據該控件的變化來存儲用戶控件數據。
如果讀者已經掌握了頁面輸出緩存的@ OutputCache指令設置方法,那麽控件緩存的@ OutputCache指令也會迎刃而解,無非僅使用其中的6個屬性而已。然而,可能會產生疑問:如果ASP.NET頁面和其中包含的用戶控件都通過@ OutputCache指令設置了緩存,那麽緩存該如何運行呢?
遇到這個問題時,應掌握以下個基本原則:壹是ASP.NET允許在頁面和頁面的用戶控件中同時使用@ OutputCache指令設置緩存,並且允許設置不同的緩存過期時間值。二是如果頁面輸出緩存過期時間長於用戶控件輸出緩存過期時間,則頁面的輸出緩存持續時間優先。例如,如果頁面輸出緩存設置為100秒,而用戶控件的輸出緩存設置為50秒,則包括用戶控件在內的整個頁將在輸出緩存中存儲100秒,而與用戶控件較短的時間設置無關。三是如果頁面輸出緩存過期時間比用戶控件的輸出緩存過期時間短,則即使已為某個請求重新生成該頁面的其余部分,也將壹直緩存用戶控件直到其過期時間到期為止。例如,如果頁面輸出緩存設置為50秒,而用戶控件輸出緩存設置為100秒,則頁面其余部分每到期兩次,用戶控件才到期壹次。