明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

.net 用戶控件(使用緩存)

[摘要]這個(gè)緩存對(duì)象如果不知道還真是不會(huì)用,但是如果有例子則一看就明白,為了讓大家少走彎路,我就把這個(gè)投上來(lái)了,更多筆記請(qǐng)?jiān)L問(wèn)我的小站http://api.533.net -----示例下載----------ASP.NET 緩存功能是一項(xiàng)很重要的功能,而這其中使用最多的就是利用用戶控件實(shí)現(xiàn)的片段緩存。有...

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