asp.net服務(wù)器端指令include的使用及優(yōu)勢介紹
asp.net中的服務(wù)端包括指令簡單點就是一個<!-- #include file|virtual="filename" –>這樣的指令,msdn中的名詞解釋是:將指定文件的內(nèi)容插入 ASP.NET 文件中,包括網(wǎng)頁(.aspx 文件)、用戶控件文件(.ascx 文件)和 Global.asax 文件。插入靜態(tài)文件這個基本功能就不說了,插入aspx、ascx,這功能算是挺強(qiáng)了,asax哥就有點困惑了,這個暫且不管,今天要說的就是這個指令。
尷尬的存在
服務(wù)器端包括指令在web的開發(fā)技術(shù)中肯定是個標(biāo)配了。asp.net前身asp中就已經(jīng)有了這個指令,做為唯一一個引用外部文件的指令,入門的開發(fā)人員都應(yīng)該使用過;php中的include、require,幾乎用濫了,曾經(jīng)使用過一段php,這指令常用的不能再常用了;jsp沒過開發(fā)經(jīng)驗,搜索了下,也有這個include指令,使用情況應(yīng)該也很平常。但是asp.net中的include幾乎是在被遺忘的角落里,讀過的asp.net的書里,很少會提到它。因此,對于沒有asp開發(fā)經(jīng)驗直接學(xué)習(xí)asp.net的來說,可能要本不知道它的存在。為什么??
造成尷尬存在原因之一,就是webform中最重要的功能之一:用戶控件。為什么要使用include,是因為被引用的內(nèi)容會在很多地方被使用到--重用,例如頁頭、頁腳、網(wǎng)站功能塊。而恰恰用戶控件就是為此而生,它天生可重用的特性,及強(qiáng)大的控件事件流程,就如MSDN中所說:
“盡管您仍然可以使用 #include 標(biāo)記(通過將公共服務(wù)器端代碼、控件或 HTML 標(biāo)記放入要包括在其他網(wǎng)頁中的文件內(nèi))以實現(xiàn)代碼重用,ASP.NET 常用的首選方法是使用 Web 用戶控件。用戶控件提供了一個面向?qū)ο蟮木幊棠P?,并且提供了比服?wù)器端包含文件更多的功能?!?BR>微軟都不待見它了,緊接著,include也被開發(fā)人員打入冷宮,但是,請不要忘記,它存在。
include詳解
說是詳解,其實不打算在這里詳解,請參見:服務(wù)器端包括指令語法。語法、用法、示例什么的,這里也不說,大家自己去看或自己試驗吧。
include優(yōu)勢
說到優(yōu)勢,肯定要有個比較的對象了,對了,這個對象就是用戶控件。用戶控件是啥玩意,不解釋。
優(yōu)勢之一:靜態(tài)文件的重用。
用戶控件功能強(qiáng)大,但是即使是簡單如靜態(tài)內(nèi)容以用戶控件的形式實現(xiàn),它也必須經(jīng)歷用戶控件的生命周期,相比性能就差了。
你可能會說,現(xiàn)如今網(wǎng)站又有多少還能是純靜態(tài)的內(nèi)容呢,譬如頁腳,那些項肯定也是網(wǎng)站CMS后臺管理的,怎么可能以靜態(tài)文件的形式存在,只能使用用戶控件,并且給用戶控件加上outputcache,這樣即保證了靈活性,性能也能有保證,這樣才是最完美的。
不錯,第一,不同的項目不同的需求,肯定有些時候就是會引用靜態(tài)內(nèi)容,這時要保證使用這些靜態(tài)內(nèi)容以靜態(tài)的形式存在,不要放到用戶控件里。第二,網(wǎng)站的優(yōu)化,無論何時,總有一種觀點,就是靜態(tài)化,例如上邊的頁腳,我們可以通過生成一個靜態(tài)的頁腳文件,當(dāng)CMS對這些項有修改時,重新生成這個文件,然后通過include方式引用,相對于緩存的不可預(yù)測性和一定的不可控性,優(yōu)勢比用戶控件還要靈活,并且性能更好。第三,協(xié)作,就是對于比較大型的網(wǎng)站,頁面某些控件,但是這些數(shù)據(jù)是其它團(tuán)隊負(fù)責(zé)的,而一些相對穩(wěn)定的內(nèi)容或者對變化不太敏感的內(nèi)容,生成靜態(tài)文件之后自動分發(fā),而對于這些文件的引用也是很常見的。
其實這個也可能是唯一的include的優(yōu)勢了。
優(yōu)勢之二,可穿透的封裝。
可重用的東西一般都是封裝的。用戶控件是一個獨立的個體,它寄宿于頁面,但本身卻像是頁面上一個自由王國,碰到王國內(nèi)部的處理,頁面會把處理權(quán)交給控件自己的去處理,例如頁面page_load加載時,碰到控件只能調(diào)用控件提供的load處理方法,這就是控件的封裝,只有自身愿意公開的屬性和方法才能被頁面訪問,這是標(biāo)準(zhǔn)的封裝,這也是由asp.net的頁面生命周期決定的。因此,如果控件要使用寄宿頁面的一個變量,那么它應(yīng)該公開一個屬性,然后由頁面在代碼里主動給它賦值。
同樣的,不同的機(jī)制決定了不同的行為。從MSDN中:
賦予 File 或 Virtual 特性的值必須用引號 ("") 括起來。在執(zhí)行任何動態(tài)代碼之前處理被包含的文件。
重要的一句,在執(zhí)行任何動態(tài)代碼之前處理被包含的文件。這句話什么意思??
一層意思就是說被包含文件在被處理之后內(nèi)容才會加入到頁面中,動態(tài)代碼執(zhí)行時,執(zhí)行的代碼根本就區(qū)分不出來這塊內(nèi)容是引用的還是自己本來就有的,也就是說我們可以用來重用的靜態(tài)文件里加入<% 代碼 %> 或者<%= 頁面變量 %> 這樣的代碼,它們會被頁面處理為相應(yīng)的內(nèi)容。這就是我所謂的“可穿透的封裝”。這種方法當(dāng)然比控件公開屬性,頁面主動賦值要更靈活。
二層意思如果引用的aspx或ascx,那么會在引用的動態(tài)內(nèi)容執(zhí)行輸出之后,頁面代碼才會執(zhí)行,這樣就不如用戶控件調(diào)用將流程在頁面內(nèi)好了,盡量不要使用include引用動態(tài)頁面。
因此我們應(yīng)只用include引用靜態(tài)文件,但是靜態(tài)文件里可以包含服務(wù)端標(biāo)記代碼。
知無不言,但怎奈能力有限,詞不達(dá)意,就當(dāng)拋磚引玉吧。大家盡量看,不過可以肯定的是可以以靜態(tài)文件存在的重用就用include吧。可能還會有其它更適合的使用場景和更多的優(yōu)勢,還請有充分經(jīng)驗的補(bǔ)充。
相關(guān)文章
asp.net gridview中用checkbox全選的幾種實現(xiàn)的區(qū)別
這幾天為了改變客戶端grid的全選效率問題,詳細(xì)研究了ext中g(shù)rid的全選和gridview中通過腳本實現(xiàn)的全選效率,總結(jié)一下,供大家參考,有錯誤的地方,希望大俠指正,小弟獻(xiàn)丑了。2009-06-06Asp.net Core MVC中怎么把二級域名綁定到特定的控制器上
這篇文章主要介紹了Asp.net Core MVC中怎么把二級域名綁定到特定的控制器上,需要的朋友可以參考下2017-06-06詳解.Net core2.0日志組件Log4net、Nlog簡單性能測試
這篇文章主要介紹了詳解.Net core2.0日志組件Log4net、Nlog簡單性能測試,比較log4net、nlog的文件寫入性能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-07-07詳解Asp.Net Core 發(fā)布和部署( MacOS + Linux + Nginx )
這篇文章主要介紹了詳解Asp.Net Core 發(fā)布和部署( MacOS + Linux + Nginx ) ,具有一定的參考價值,有興趣的可以了解一下。2016-12-12ASP.NET?MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽2(七)
這篇文章主要為大家詳細(xì)介紹了ASP.NET?MVC5網(wǎng)站開發(fā)之用戶添加和瀏覽,感興趣的小伙伴們可以參考一下2016-08-08ASP.NET 根據(jù)漢字獲取漢字拼音的首字母(含多音字)
本文分享了一個函數(shù),這個函數(shù)可以根據(jù)漢字的字符串獲取其拼音的首字母,以便我們在實際開發(fā)中使用。2016-04-04CHECKBOX 的全選、取消及跨頁保存的實現(xiàn)方法
CHECKBOX的操作在頁面中很常見,比如全選、取消、跨頁保存等等,下面有個不錯的示例,大家可以嘗試操作下2013-10-10