從繼承關係上看,Asp.net 伺服器控制項的類別大致上分為4類:
1、 使用者控制項
類似page,基本上不需要編程,可以將某個aspx頁面作為複用組件使用。
2、 LiteralControl
ASP.NET 將所有不需要伺服器端處理的 HTML 元素和可讀文本編譯為該類的執行個體。例如,開始標記中不包含 runat="server" 屬性/值對的 HTML 元素被編譯為 LiteralControl 對象。
文本控制項的行為與文本容納器一樣,這意味著可以從文本控制項提取文本,並通過父伺服器控制項的 Controls 屬性從父伺服器控制項的 ControlCollection 中移除文本控制項。因此,當開發從 LiteralControl 類匯出的自訂控制項時,確保由控制項自己執行任何所需的預先處理步驟,而不是使用對 LiteralControl.Render 方法調用的調用來實現它們。一般都會這樣做以提高 Web 應用程式的回應時間。
LiteralControl一般不會觸發伺服器端事件。
可以以編程方式分別使用 ControlCollection.Add 或 ControlCollection.Remove 方法,從頁或伺服器控制項添加或移除文本控制項。
3、 HtmlControl
HTML元素的asp.net模型伺服器端對應組件。每一個HtmlControl直接對應於特定的HTML元素(不一定是輸入元素)。
4、 WebControl
通常的Web控制項。可以理解為屬於複雜的HTML元素以及伺服器端處理邏輯組成的。
繼承關係圖:
System.Object
System.Web.UI.Control
System.Web.UI.TemplateControl
System.Web.UI.Page
System.Web.UI.UserControl
System.Web.UI.LiteralControl
System.Web.UI.HtmlControl
System.Web.UI.WebControl
通常需要程式員開發的屬於使用者控制項、web控制項。xxx
從WebControl繼承而來的web伺服器組件,往往繼承了豐富的UI元素和控制能力。
使用者控制項
1、 為什麼是使用者控制項
現代人喜好偷懶,喜歡“所見即所得 (WYSIWYG)”以及“拖放”式的編程。在一個阿asp.net web項目中往往會在多個頁面中存在共用的UI,譬如header footer等,如果所有頁面的內容都一致,往往採用包含特定的js檔案來實現,但如果這些多個頁面都需要的UI部分跟隨不同的使用者狀態等不同而會不同,這是必須採用動態邏輯處理,普通的js/html就無法滿足要求。之前asp中採用include asp檔案來實現,現在asp.net改變了包含asp檔案的種種缺限而採用使用者控制項來解決。
使用者控制項本質上是一個獨立的asp.net檔案,副檔名為ascx。使用者控制項通常依賴於特定的asp.net web項目。當使用使用者控制項時,asp.net頁面解析器從aspx檔案中動態產生一個類,將其編譯到一個特定的裝配件(臨時緩衝中託管dll),並按照.net方式引用此類執行個體,並進行處理。
2、 如何得到使用者控制項
得到使用者控制項,在vs中實際上僅需要:
在web項目中添加—〉使用者控制項—〉輸入使用者控制項名—〉在得到的空白頁面進行UI設計,並儲存。
使用時,將使用者控制項拖放在web 表單上,即可使用使用者控制項。此時vs替代我們做了一下工作:
在使用使用者控制項的頁面添加一個register指令。具體為:
<%@ Register TagPrefix="uc1" TagName="WebUserControl1" Src="WebUserControl1.ascx" %> 對於頁面解譯器可解釋為:將<uc1: WebUserControl1 作為使用者控制項來解釋,uc1為標籤首碼(類似標準web控制項的asp標籤首碼),WebUserControl1作為此使用者控制項的標籤,遇到這一組合就解釋為使用使用者控制項執行個體。Src值為該使用者控制項源檔案所在的虛擬路徑,但不可以為絕對路徑。
3、 使用者控制項的實質(asp.net的使用者控制項的背景)
asp.net是編譯的,處理使用者控制項同處理頁面是類似的,頁面中所有元素都是編譯成特定類被asp.net頁面類調用、觸發事件的。使用者控制項也是通過此途徑被複用的。當處理使用者控制項時,頁面架構執行以下步驟:
解釋ascx檔案,相應解釋成為一個派生於System.Web.UI.UserControl的託管類
動態編譯到自動產生的裝配件中。
以上過程僅在第一次使用使用者控制項時發生,以後複用此使用者控制項會省略此步驟。頁面使用register指令,將會引用此類。頁面中的使用者控制項會成為此類的執行個體。實際上使用者控制項也是編寫asp.net類,派生於System.Web.UI.UserControl的類,頁面使用這些類如同使用ASP.net的標準類,為以不同在於標準控制項類內建可直接執行個體化使用,而使用者控制項需要在使用前進行類似頁面的編譯工作,編譯得到類並組裝到裝配件後可以被執行個體化。
4、 使用者控制項編程注意事項
使用者組件不可以通過new方式執行個體化,因為使用者控制項類屬於動態產生,new的時候(這個時候應當是頁面編譯時間候,使用者控制項還沒有被運行使用),使用者控制項類還不存在。但是可以通過Page.LoadControl(string controlname)來裝載,此時為了loadControl可以找到使用者控制項,需要採用refence指令:<%@ Refence Control=”xxx/UserControlSamples.ascx”%> 。
使用者控制項可以被另外使用者控制項嵌套使用,但一定要確保使用者控制項引用位置正確。
使用者控制項本身屬於UI,可以被緩衝,通過ascx檔案頂端的OutPutCache指令來確定。
使用者控制項代碼中到的URL是指使用者控制項存在的路徑,而不是調用使用者控制項的頁面代碼的路徑,需要通過Page.ResolveUrl進行正確的解析。