作者: planRED Email: planred#163.com 來自: http://api.533.net
這個緩存對象如果不知道還真是不會用,但是如果有例子則一看就明白,為了讓大家少走彎路,我就把這個投上來了,更多筆記請訪問我的小站
http://api.533.net
-----示例下載----------
ASP.NET 緩存功能是一項很重要的功能,而這其中使用最多的就是利用用戶控件實(shí)現(xiàn)的片段緩存。
有時候,緩存整個頁是不實(shí)際的;可能需要為每個請求動態(tài)創(chuàng)建頁的某些部分。在這些情況下,您可能值得花時間來標(biāo)識與需要大量的服務(wù)器資源來構(gòu)造的頁請求相關(guān)聯(lián)的對象或數(shù)據(jù)。一旦標(biāo)識了這些項,您就可以通過在 Web 窗體用戶控件中創(chuàng)建這些項將它們從頁的其他部分分離出來,然后在一段指定的時間中對這些項進(jìn)行緩存,以節(jié)省服務(wù)器資源。這就是通常所說的片段緩存。這項技術(shù)允許您將需要花寶貴的處理器時間來創(chuàng)建的頁的某些部分(例如數(shù)據(jù)庫查詢)與頁的其他部分分離開。您可以選擇允許為每個請求動態(tài)生成需要較少服務(wù)器資源的頁的部分。
要使用戶控件具有緩存功能,只要在.ascx文件的頂部添加 @OutoutCache 指令即可,關(guān)于這個指令的詳細(xì)內(nèi)容可以參看sdk文檔的這一部分:ms-help://MS.NETFrameworkSDKv1.1.CHS/cpgenref/html/cpconoutputcache.htm 下面我們來看常用的方式:
<%@ OutputCache Duration="30" VaryByParam="None"%> 上面是說緩存這個控件30秒,并且緩存內(nèi)容不隨任何指定參數(shù)發(fā)生變化。
下面我們可以用這個控件了,像通常的做法,就是在.aspx頁面用 @Register 指令聲明,并在頁面中添加。如果只是想在.aspx頁面就完成整個工作,那到這里一切就算完了。 <user:timex id="uctime" runat="server"></user:timex>
但是如果想在codebehind中使用控件的屬性,我的意思是說在.cs文件中指定屬性,或是動態(tài)加載一個用戶控件,那就得多花一些心思。 先來在codebehind中使用一下這個帶緩存的控件。
uctime.times=System.DateTime.Now.ToString();
times是這個控件的一個屬性,作用是指定控件中l(wèi)abel的text值。這個頁面在初次運(yùn)行時沒有任何問題,但是當(dāng)你刷新頁面后,就會發(fā)生錯誤,提示說這個控件根本就不存在!你還可以用動態(tài)加載的方式運(yùn)行一下這個例子,也會發(fā)生同樣的錯誤。 如果在頁中聲明并使用了為輸出緩存指定的用戶控件,則 ASP.NET 頁分析器將根據(jù)用戶控件的創(chuàng)建方式,對兩個對象類型中的一個類型進(jìn)行實(shí)例化。如果以聲明方式創(chuàng)建用戶控件,會添加 StaticPartialCachingControl 對象;如果使用 LoadControl 方法以編程方式創(chuàng)建用戶控件,會添加 PartialCachingControl 對象
上面的意思是:一旦你使用了一個具有OutoutCache內(nèi)容的用戶控件,系統(tǒng)會根據(jù)控件的創(chuàng)建形式相應(yīng)的建立新的緩存對象,然后在整個緩存周期內(nèi)一直使用這個新的緩存對象,而不是使用用戶控件本身。也就是說頁面初此加載時是使用的用戶控件本身,接下來在緩存周期內(nèi)就是使用的緩存對象。這就是為什么上面會出現(xiàn)錯誤的原因。
找到了原因,解決問題就簡單多了。我們可以在.cs中加一個判斷,然后為用戶控件本身和緩存對象分別添加屬性的賦值。(在這里說說辦法簡單,偶為了找這個答案可費(fèi)了大力氣了,不過最后還是csdn的高人幫偶解決了,嘿嘿) 這個還是得分頁面聲明和動態(tài)加載兩類來說。 先看頁面聲明時的做法:
protected prac2.uc_cache uctime; private void Page_Load(object sender, System.EventArgs e) { set(); }
private void set() { if(uctime!=null) { uctime.times=System.DateTime.Now.ToString(); } } 先在codebehind中聲明控件,然后在使用屬性的時候判斷,如果控件不為空,就表示是初次加載。這個時候給屬性賦值。這樣當(dāng)頁面再次加載時,因?yàn)槭褂昧司彺,該流程就不進(jìn)了。但是屬性值依然存在。 再看動態(tài)加載時的做法: protected System.Web.UI.WebControls.PlaceHolder placetime; private void Page_Load(object sender, System.EventArgs e) { loaduc(); } private void loaduc() { //先是動態(tài)加載該控件,在初次加載時,其類型顯然是uc_cache Control ucc=LoadControl("uc_cache.ascx"); placetime.Controls.Add(ucc); prac2.uc_cache uctime=null; //第一次執(zhí)行的流程 if(ucc is prac2.uc_cache) { uctime=(prac2.uc_cache)ucc; } //第二次及其以后整個緩存周期執(zhí)行的流程 else if(ucc is PartialCachingControl&&((PartialCachingControl )ucc).CachedControl!=null) { uctime=(prac2.uc_cache)((PartialCachingControl)ucc).CachedControl; } //最后,給屬性賦值 if(uctime!=null) { uctime.times=System.DateTime.Now.ToString(); } }
這個就更加清楚的說明了緩存控件的工作原理,先是加載一個控件,然后根據(jù)是用戶控件本身還是緩存控件來分別進(jìn)行操作,最后給控件的屬性賦值。這段程序通過使用一個中間量來完成對控件屬性的操作,ucc是其中動態(tài)加載的控件,第一次的時候?yàn)橛脩艨丶,而到了第二次,就變成了一個緩存控件,程序分別對這兩次改變進(jìn)行不同的操作,最后的結(jié)果都是把ucc正確的賦給了uctime,最后uctime得以操作屬性。
在轉(zhuǎn)載精華部分的第13篇文章也是就該內(nèi)容展開的討論,實(shí)際上我就是看這篇文章才弄明白了PartialCachingControl的用法。 我在csdn的發(fā)帖的位置,感興趣的可以去看看:
http://community.csdn.net/Expert/TopicView.asp?id=3138685
到這里,用戶控件的基本內(nèi)容應(yīng)該就結(jié)束了。在以后的實(shí)踐中,應(yīng)該努力的學(xué)習(xí)怎么更好的使用這一強(qiáng)大的技術(shù)-用戶控件。
出處:藍(lán)色理想
責(zé)任編輯:藍(lán)色
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|