在前面的文章中,主要介紹了服務器控件的基本概念、基本理論,這些內容是構建所有自定義服務器控件的基石。然而,僅僅依靠這些知識還不足以創建出優秀的服務器控件。因為,不同類型的服務器控件具有不同的創建方法,開發人員必須在掌握基本概念和理論之後,掌握不同類型服務器控件的開發方法。本文及其隨後幾篇文章將詳細介紹與創建復合控件相關的內容。本文重點介紹有關復合控件的概念、創建方法等理論,然後,通過一個典型示例加深讀者對於復合控件創建方法的理解。
復合控件概述
復合控件中的“復合”一詞表明該類型控件本質上由多個組件組合而成。同時,復合控件對外暴露的成員對象通常由構成組件的方法和屬性提供,並且可能加入一些新的成員。復合控件也可以實現自定義事件,並處理並引發子控件所引起的事件。就功能方面而言,復合控件的功能要比簡單組合幾個控件的功能要強大的多,而且很多時候具有一定的專項性。例如,ASP.NET 2.0新增的Login控件就是一個典型的復合控件。該控件用戶界面由多個單獨控件組合而成,並且使用單一的API對控件進行設置和訪問。另外,Login控件由於與成員資格等功能集成的原因,因此,其具有快速實現用戶登錄的功能。
可能部分有經驗的讀者在了解了復合控件的基本概念之後會有所疑惑:復合控件與用戶控件好像非常相似,那麼它們之間有什麼區別嗎?到底什麼時候創建復合控件,什麼時候創建用戶控件呢?回答這個問題,我們必須從用戶控件的基本概念入手進行研究。
簡單而言,用戶控件是指在一個項目中,由於同樣一些功能模塊在多處引用,例如,導航菜單等,可以把這一塊代碼做成一個用戶控件,然後,在需要引用的頁面中注冊後,直接按控件使用的方式引用,省去了重復編寫相同代碼的工作。就復合控件與用戶控件的區別而言,主要可以總結為以下幾點:
一、復合控件創作的最短設計時支持,用戶控件創作的完全設計時支持。在可視化設計器中,創作用戶控件與創作ASP.NET頁沒有差別。
二、復合控件是以目標為公共語言運行庫的面向對象的編程語言,如C#,是用編程方式創作的用戶控件是使用ASP.NET頁語法和腳本塊聲明性地創作的。
三、復合控件是作為程序集(.dll)編譯和保持的。用戶控件是帶有.ascx擴展名的文本文件。
四、復合控件非常適於創作一般的可重新發布的控件,用戶控件適合應用程序特定的功能。
五、可將復合控件添加到可視化設計器的工具箱中並拖放到頁面上,使用時可以在屬性框中設計,用戶控件只能在HTML中編寫。
通過以上內容,相信讀者已經能夠基本了解了復合控件。下面介紹一下創建復合控件的實現方法。在這個過程中,開發人員必須把握以下幾個要點:
第一、通常情況,復合控件類必須派生自System.Web.UI.WebControls.CompositeControl類。這一點與ASP.NET 1.x環境下開發復合控件有些不同。在ASP.NET 1.x中,復合控件必須實現System.Web.UI.INamingContainer接口。然而,在ASP.NET 2.0下,復合控件類的基類則發生了變化。下面簡單介紹一下CompositeControl類。
CompositeControl類是一個抽象類,該類可為自定義控件提供命名容器和控件設計器功能,並且可包含全部子控件或使用其他控件功能。CompositeControl類的聲明代碼如下所示:
public abstract class CompositeControl : WebControl, INamingContainer, ICompositeControlDesignerAccessor
如上代碼所示,CompositeControl類基層自WebControl基類,並且實現INamingContainer和ICompositeControlDesignerAccessor接口。INamingContainer是一個沒有方法的標記接口。當控件在實現INamingContainer時,頁框架可在該控件下創建新的命名范圍,因此,能夠確保子控件在控件的分層樹中具有唯一的名稱。當復合控件公開模板屬性,提供數據綁定或需要傳送事件到子控件時,這是非常重要的。ICompositeControlDesignerAccessor接口使復合控件設計器可以在設計時重新創建其關聯控件的子控件。該接口包含一個需要實現的方法RecreateChildControls。該方法使復合控件的設計器可以在設計時重新創建該控件的子控件。
另外,如果創建的是數據綁定復合控件,那麼自定義控件類的基類應該是CompositeDataBoundControl。有關該類的具體內容,請讀者查閱相關資料。