.net 用戶控件(使用緩存)
發(fā)表時間:2024-05-30 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]這個緩存對象如果不知道還真是不會用,但是如果有例子則一看就明白,為了讓大家少走彎路,我就把這個投上來了,更多筆記請訪問我的小站http://api.533.net -----示例下載----------ASP.NET 緩存功能是一項很重要的功能,而這其中使用最多的就是利用用戶控件實現(xiàn)的片段緩存。有...
這個緩存對象如果不知道還真是不會用,但是如果有例子則一看就明白,為了讓大家少走彎路,我就把這個投上來了,更多筆記請訪問我的小站http://api.533.net -----示例下載----------ASP.NET 緩存功能是一項很重要的功能,而這其中使用最多的就是利用用戶控件實現(xiàn)的片段緩存。有時候,緩存整個頁是不實際的;可能需要為每個請求動態(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值。這個頁面在初次運行時沒有任何問題,但是當(dāng)你刷新頁面后,就會發(fā)生錯誤,提示說這個控件根本就不存在!你還可以用動態(tài)加載的方式運行一下這個例子,也會發(fā)生同樣的錯誤。
如果在頁中聲明并使用了為輸出緩存指定的用戶控件,則 ASP.NET 頁分析器將根據(jù)用戶控件的創(chuàng)建方式,對兩個對象類型中的一個類型進(jìn)行實例化。如果以聲明方式創(chuàng)建用戶控件,會添加 StaticPartialCachingControl 對象;如果使用 LoadControl 方法以編程方式創(chuàng)建用戶控件,會添加 PartialCachingControl 對象 上面的意思是:一旦你使用了一個具有OutoutCache內(nèi)容的用戶控件,系統(tǒng)會根據(jù)控件的創(chuàng)建形式相應(yīng)的建立新的緩存對象,然后在整個緩存周期內(nèi)一直使用這個新的緩存對象,而不是使用用戶控件本身。也就是說頁面初此加載時是使用的用戶控件本身,接下來在緩存周期內(nèi)就是使用的緩存對象。這就是為什么上面會出現(xiàn)錯誤的原因。找到了原因,解決問題就簡單多了。我們可以在.cs中加一個判斷,然后為用戶控件本身和緩存對象分別添加屬性的賦值。(在這里說說辦法簡單,偶為了找這個答案可費了大力氣了,不過最后還是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)頁面再次加載時,因為使用了緩存,該流程就不進(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)加載的控件,第一次的時候為用戶控件,而到了第二次,就變成了一個緩存控件,程序分別對這兩次改變進(jìn)行不同的操作,最后的結(jié)果都是把ucc正確的賦給了uctime,最后uctime得以操作屬性。在轉(zhuǎn)載精華部分的第13篇文章也是就該內(nèi)容展開的討論,實際上我就是看這篇文章才弄明白了PartialCachingControl的用法。
我在csdn的發(fā)帖的位置,感興趣的可以去看看: http://community.csdn.net/Expert/TopicView.asp?id=3138685 到這里,用戶控件的基本內(nèi)容應(yīng)該就結(jié)束了。在以后的實踐中,應(yīng)該努力的學(xué)習(xí)怎么更好的使用這一強大的技術(shù)-用戶控件。