ASP.NET自定義控件入門淺析
ASP.NET自定義控件的必要性:在服務(wù)器端中執(zhí)行程序邏輯的組件,是ASP.NET 應(yīng)用程序的基本構(gòu)造塊。為了能夠在ASP.NET環(huán)境執(zhí)行,必須滿足一定條件。
為了能夠參與到網(wǎng)頁(yè)框架執(zhí)行,需要滿足IComponent, IDisposable, IParserAccessor, IdataBindingsAccessor等接口。所以框架提供System.Web.Control類供控件開發(fā)者繼承。
- IComponent//提供組件所需的基本功能,接口實(shí)現(xiàn)為:
- {
- ISite Site {get; set;}//提供站點(diǎn)接口,組件可以通過此接口訪問容器
- event EventHandler Disposed; //事件
- }
如果實(shí)現(xiàn)了此接口,就成為可設(shè)計(jì)組件,可加入到可視化設(shè)計(jì)器工具箱,能夠脫放到頁(yè)面(Isite接口)中,屬性瀏覽器中顯示屬性。
IDisposable 接口實(shí)現(xiàn)組件自身資源釋放(Icomponent實(shí)際上繼承自IDisposable )
IParserAccessor 該接口規(guī)定AddParsedSubObject(object obj)方法用于通知服務(wù)器控件已分析元素(XML 或 HTML)。分析元素時(shí),元素被識(shí)別為實(shí)現(xiàn)該接口的服務(wù)器控件的子級(jí)。這些元素將被轉(zhuǎn)換為對(duì)象。實(shí)現(xiàn)該接口時(shí),所創(chuàng)建的控件在被通知已分析元素后立即定義要發(fā)生的處理。
- IDataBindingsAccessor //接口允許在設(shè)計(jì)時(shí)訪問控件的數(shù)據(jù)綁定表達(dá)式集合。
- {
- DataBindingCollection DataBindings {get;}// 指示控件的所有數(shù)據(jù)綁定的集合。此屬性為只讀。
- bool HasDataBindings {get;} //返回控件是否包含任何數(shù)據(jù)綁定邏輯。
- }
繼承自Control的WebControl類為表現(xiàn)HTML(畢竟最后用戶看到的是HTML)而在Control類中加入了一些新的功能,如樣式、字體、背景、前景。。。
ASP.NET自定義控件之Control類的定義:
◆公共屬性:
ClientID 獲取由 ASP.NET 生成的服務(wù)器控件標(biāo)識(shí)符。
Controls 獲取 ControlCollection 對(duì)象,該對(duì)象表示 UI 層次結(jié)構(gòu)中指定服務(wù)器控件的子控件。
EnableViewState 獲取或設(shè)置一個(gè)值,該值指示服務(wù)器控件是否向發(fā)出請(qǐng)求的客戶端保持自己的視圖狀態(tài)以及它所包含的任何子控件的視圖狀態(tài)。
ID 獲取或設(shè)置分配給服務(wù)器控件的編程標(biāo)識(shí)符。
NamingContainer 獲取對(duì)服務(wù)器控件的命名容器的引用,此引用創(chuàng)建唯一的命名空間,以區(qū)分具有相同 Control.ID 屬性值的服務(wù)器控件。
Page 獲取對(duì)包含服務(wù)器控件的 Page 實(shí)例的引用。
Parent 獲取對(duì)頁(yè) UI 層次結(jié)構(gòu)中服務(wù)器控件的父控件的引用。
Site 獲取有關(guān)服務(wù)器控件所屬 Web 站點(diǎn)的信息(原文自MSDN,但是我認(rèn)為不對(duì),應(yīng)該是指組件的“容器”站點(diǎn),并非 web site)。
TemplateSourceDirectory 獲取包含當(dāng)前服務(wù)器控件的 Page 或 UserControl 的虛擬目錄。
UniqueID 獲取服務(wù)器控件的唯一的、以分層形式限定的標(biāo)識(shí)符。
Visible 獲取或設(shè)置一個(gè)值,該值指示服務(wù)器控件是否作為 UI 呈現(xiàn)在頁(yè)上。
◆公共方法
DataBind 將數(shù)據(jù)源綁定到被調(diào)用的服務(wù)器控件及其所有子控件。
Dispose 使服務(wù)器控件得以在從內(nèi)存中釋放之前執(zhí)行最后的清理操作。
Equals(從 Object 繼承) 已重載。確定兩個(gè) Object 實(shí)例是否相等。
FindControl 已重載。在當(dāng)前的命名容器中搜索指定的服務(wù)器控件。
GetHashCode(從 Object 繼承) 用作特定類型的哈希函數(shù),適合在哈希算法和數(shù)據(jù)結(jié)構(gòu)(如哈希表)中使用。
GetType(從 Object 繼承) 獲取當(dāng)前實(shí)例的 Type。
HasControls 確定服務(wù)器控件是否包含任何子控件。
RenderControl 將服務(wù)器控件的內(nèi)容輸出到所提供的 HtmlTextWriter 對(duì)象中;如果已啟用跟蹤功能,則存儲(chǔ)有關(guān)控件的跟蹤信息。
ResolveUrl 根據(jù)傳遞給 TemplateSourceDirectory 屬性的值,將相對(duì) URL 解析為絕對(duì) URL。
ToString(從 Object 繼承) 返回表示當(dāng)前 Object 的 String。
◆公共事件
DataBinding 當(dāng)服務(wù)器控件綁定到數(shù)據(jù)源時(shí)發(fā)生。
Disposed 當(dāng)從內(nèi)存釋放服務(wù)器控件時(shí)發(fā)生,這是請(qǐng)求 ASP.NET 頁(yè)時(shí)服務(wù)器控件生存期的最后階段。
Init 當(dāng)服務(wù)器控件初始化時(shí)發(fā)生;初始化是控件生存期的第一步。服務(wù)器控件應(yīng)執(zhí)行任何創(chuàng)建和設(shè)置實(shí)例所需的初始化步驟。在該事件內(nèi)無(wú)法使用視圖狀態(tài)信息;它尚未填充。在該事件的生存期內(nèi)不應(yīng)訪問其他服務(wù)器控件,不論它是此控件的子級(jí)還是父級(jí)。不一定會(huì)創(chuàng)建其他服務(wù)器控件,也不一定能夠訪問它們。
Load 當(dāng)服務(wù)器控件加載到 Page 對(duì)象中時(shí)發(fā)生。通知服務(wù)器控件執(zhí)行任何設(shè)置為在每次頁(yè)請(qǐng)求時(shí)發(fā)生的處理步驟。開發(fā)者可以訪問視圖狀態(tài)信息并利用該事件形成 POST 數(shù)據(jù)。還可以訪問頁(yè)控件層次結(jié)構(gòu)內(nèi)的其他服務(wù)器控件。
PreRender 當(dāng)服務(wù)器控件將要呈現(xiàn)給其包含的 Page 對(duì)象時(shí)發(fā)生。使用該事件在服務(wù)器控件呈現(xiàn)給頁(yè)的輸出之前執(zhí)行任何更新。在該事件的生存期內(nèi)可以保存服務(wù)器控件視圖狀態(tài)的任何更改。不保存呈現(xiàn)階段內(nèi)所做的同樣更改。
Unload 當(dāng)服務(wù)器控件從內(nèi)存中卸載時(shí)發(fā)生。
ASP.NET自定義控件之受保護(hù)的屬性和方法有:
◆保護(hù)的屬性
ChildControlsCreated 獲取一個(gè)值,該值指示是否已創(chuàng)建服務(wù)器控件的子控件。
Context 為當(dāng)前 Web 請(qǐng)求獲取與服務(wù)器控件關(guān)聯(lián)的 HttpContext 對(duì)象。
Events 獲取控件的事件處理程序委托列表。此屬性為只讀。
HasChildViewState 獲取一個(gè)值,該值指示當(dāng)前服務(wù)器控件的子控件是否具有任何已保存的視圖狀態(tài)設(shè)置。
IsTrackingViewState 獲取一個(gè)值,該值指示服務(wù)器控件是否將更改保存到其視圖狀態(tài)。
ViewState 獲取狀態(tài)信息的字典,這些信息使您可以在同一頁(yè)的多個(gè)請(qǐng)求間保存和還原服務(wù)器控件的視圖狀態(tài)。
ViewStateIgnoresCase 獲取一個(gè)值,該值指示 StateBag 對(duì)象是否不區(qū)分大小寫。
◆受保護(hù)的方法
AddParsedSubObject 通知服務(wù)器控件某個(gè)元素(XML 或 HTML)已經(jīng)過語(yǔ)法分析,并將該元素添加到服務(wù)器控件的 ControlCollection 對(duì)象。
ClearChildViewState 刪除服務(wù)器控件的所有子控件的視圖狀態(tài)信息。
CreateChildControls 通知使用基于合成的實(shí)現(xiàn)的服務(wù)器控件創(chuàng)建它們包含的任何子控件,以便為回發(fā)或呈現(xiàn)做準(zhǔn)備。
CreateControlCollection 創(chuàng)建一個(gè)新的 ControlCollection 對(duì)象來(lái)保存服務(wù)器控件的子控件(包括文本控件和服務(wù)器控件)。
EnsureChildControls 確定服務(wù)器控件是否包含子控件。如果不包含,則創(chuàng)建子控件。
Finalize(從 Object 繼承) 已重寫。允許 Object 在“垃圾回收”回收 Object 之前嘗試釋放資源并執(zhí)行其他清理操作。
IsLiteralContent 確定服務(wù)器控件是否只包含文字內(nèi)容。ASP.NET頁(yè)面中普通的html標(biāo)簽被ASP.NET編譯為一個(gè) LiteralContent控件(意味著輕型控件)。
LoadViewState 從 SaveViewState 方法保存的上一個(gè)頁(yè)請(qǐng)求還原視圖狀態(tài)信息。
MapPathSecure 如果請(qǐng)求服務(wù)器控件有足夠的安全權(quán)限讀取映射結(jié)果,檢索相對(duì)于源文件的映射物理文件路徑。
MemberwiseClone(從 Object 繼承) 創(chuàng)建當(dāng)前 Object 的淺表副本。
OnBubbleEvent 確定服務(wù)器控件的事件是否沿頁(yè)的 UI 服務(wù)器控件層次結(jié)構(gòu)向上傳遞。
OnDataBinding 引發(fā) DataBinding 事件。
OnInit 引發(fā) Init 事件。
OnLoad 引發(fā) Load 事件。
OnPreRender 引發(fā) PreRender 事件。
OnUnload 引發(fā) Unload 事件。 注意 在服務(wù)器控件生存期的此階段,服務(wù)器控件應(yīng)執(zhí)行所有最后的清理操作,例如關(guān)閉文件、關(guān)閉數(shù)據(jù)庫(kù)連接和丟棄對(duì)象。
RaiseBubbleEvent 將所有事件源及其信息分配給控件的父級(jí)。
Render 將服務(wù)器控件內(nèi)容發(fā)送到提供的 HtmlTextWriter 對(duì)象,此對(duì)象編寫將在客戶端呈現(xiàn)的內(nèi)容。
RenderChildren 將服務(wù)器控件子級(jí)的內(nèi)容輸出到提供的 HtmlTextWriter 對(duì)象,此對(duì)象編寫將在客戶端呈現(xiàn)的內(nèi)容。
SaveViewState 保存自頁(yè)回發(fā)到服務(wù)器后發(fā)生的任何服務(wù)器控件視圖狀態(tài)更改。
TrackViewState 導(dǎo)致跟蹤服務(wù)器控件的視圖狀態(tài)的更改,以便這些更改可以存儲(chǔ)到服務(wù)器控件的 StateBag 對(duì)象中。通過 Control.ViewState 屬性可訪問此對(duì)象。
了解了Control這個(gè)“基石”,我們可以了解到,編寫服務(wù)器組件就是在此基石上建造,同時(shí)我們可以調(diào)用的方法、數(shù)據(jù),可以截獲的事件都列出,以上數(shù)據(jù)成員是我們編寫服務(wù)器控件的“輸入數(shù)據(jù)”(當(dāng)然還可以有其他輸入數(shù)據(jù),但是主要數(shù)據(jù)在此);以上方法是幫助我們操控控件以及控件同外部交互,事件為我們“感知”外部交互提供時(shí)機(jī);另外,服務(wù)器控件也需要被容器調(diào)用相關(guān)方法(譬如render),我們可以重寫這些方法,修改Control的缺省GUI表現(xiàn)。
ASP.NET自定義控件的相關(guān)介紹就向你講解到這里,希望對(duì)你學(xué)習(xí)ASP.NET自定義控件有所幫助。