ASP.NET自定義控件開發(fā)淺析
ASP.NET自定義控件的開發(fā)不僅可以使你開發(fā)出更靈活的系統(tǒng)更重要的是它可以使你加深對(duì)已有服務(wù)器控件的理解,得以更靈活的應(yīng)用。
較之于ASP,ASP.NET提供了更強(qiáng)大的功能,我比較喜歡它的代碼分離技術(shù)和對(duì)諸如C#、VB.Net等強(qiáng)類型語言的使用,這是從開發(fā)者的角度來看的,從用戶的角度來看,會(huì)覺得它速度更快,運(yùn)行更穩(wěn)定,安全性也更高。不管怎么說,新技術(shù)的產(chǎn)生總會(huì)使許多人感到高興,不過對(duì)開發(fā)者來說,壞消息是他們需要學(xué)習(xí)更多新的知識(shí)。
ASP.NET有了很多的改變,比如你可能會(huì)發(fā)現(xiàn)供我們操作的元素也和以前有了很大的不同,原來標(biāo)準(zhǔn)的HTML元素變成了現(xiàn)在的服務(wù)器控件,所謂服務(wù)器控件,就是在服務(wù)器上運(yùn)行,并可以映射到所有瀏覽器支持的標(biāo)準(zhǔn) HTML 標(biāo)記的控件,在你的web窗體中,凡是包含 runat="server" 屬性聲明的元素都叫做服務(wù)器控件(在VS.Net中的設(shè)計(jì)頁面中,用一個(gè)小小的綠色箭頭表示),你可以用原有的HTML元素并加上runat=”server”屬性使其變?yōu)橐粋€(gè)服務(wù)器控件,這叫做HtmlControls,它可以直接映射到標(biāo)準(zhǔn)HTML標(biāo)記;也可以使用.Net提供的全新的WebControls,它比前者更抽象,功能也更加強(qiáng)大。不管采用哪一類控件,runat=”server”屬性都將會(huì)使你可以以編程方式訪問這些元素。
這很容易理解,服務(wù)器控件就是在服務(wù)器端運(yùn)行的控件,經(jīng)過服務(wù)器端某些程序的解析再生成標(biāo)準(zhǔn)的HTML代碼顯示在我們的瀏覽器上,事實(shí)上,Web Form之所以可以提供最大可能的瀏覽器兼容性也是基于此理。與通常的理解稍稍有些不同,在asp.net中,一個(gè)頁面(Page),一個(gè)驗(yàn)證控件,一個(gè)用戶控件(User Control),都可以看作是一個(gè)獨(dú)立的控件,它來自于其它控件的組合。除了使用.Net提供的一系列控件外,你還可以到網(wǎng)上找一些免費(fèi)的控件,www.asp.net中的Control Gallery一欄就收集了很多常用的Control。
在ASP.NET自定義控件中,(傳統(tǒng)意義上)可供你開發(fā)的控件實(shí)際上有兩種:Custom Control 和 User Control。Custom Control 是縱向的,是對(duì)系統(tǒng)本身控件的繼承和擴(kuò)充,在程序中以DLL文件形式存在,User Control 則是橫向的,是對(duì)系統(tǒng)本身控件的組合,在系統(tǒng)中以.ascx為后綴名。這兩種控件功能相同,都可以為開發(fā)人員提供可復(fù)用的可視化UI組件,相比之下前者具有更大的靈活性,同時(shí)開發(fā)起來比較復(fù)雜,而后者容易開發(fā),但可重用性就比較差。一般來說用戶會(huì)先用User Control來開發(fā),只有當(dāng)其不堪重用的時(shí)候才轉(zhuǎn)而使用Custom Control。
事實(shí)上,用戶自己開發(fā)Custom Control并不是一件很困難的事,只需要定義一個(gè)直接或間接從Control 派生的類并重寫它的 Render 方法即可,System.Web.UI.Control與System.Web.UI.WebControls.WebControl兩個(gè)類是服務(wù)器控件的基類。 Control 類定義了所有服務(wù)器控件共有的屬性、方法和事件。其中包括控制控件執(zhí)行生命周期的方法和事件,以及 ID、UniqueID、Parent、ViewState 和 Controls(子控件集合)等屬性。Control 沒有用戶界面 (UI) 特定的任何功能。如果創(chuàng)作的控件沒有提供 UI,或者組合了其他呈現(xiàn)其自己的 UI 的控件,則從 Control 派生。 WebControl 類是從 Control 派生的,并為 UI 功能提供附加的屬性和方法。這些屬性包括 ForeColor、BackColor、Font、BorderStyle、Height 和 Width。WebControl 是 ASP.NET 中 Web 服務(wù)器控件系列的基類。如果控件呈現(xiàn) UI,則從 WebControl 派生。
可以重寫從基類繼承的屬性、方法和事件,并可以將新的屬性、方法和事件添加到自定義控件中,所前所述,我們使用重寫Render方法來實(shí)現(xiàn)對(duì)HTML代碼的輸出。Render 方法采用 System.Web.UI.HtmlTextWriter 類型的參數(shù)??丶l(fā)送到客戶端的 HTML 作為字符串參數(shù)傳遞到 HtmlTextWriter 的 Write 方法。下面我們使用VS.NET來開發(fā)一個(gè)簡單的自定義控件(使用VS.Net的原因是為了方便開發(fā)者調(diào)試,在正式開發(fā)中我們經(jīng)常使用的也是VS.Net)。
首先新建一個(gè)空白解決方案,然后為其添加兩個(gè)項(xiàng)目,一個(gè)名為MyControls的Web控件庫項(xiàng)目和一個(gè)叫做Web的Web應(yīng)用程序項(xiàng)目,后者用于測試我們開發(fā)出的控件。
在Web項(xiàng)目上點(diǎn)擊右鍵,選擇依賴項(xiàng),使項(xiàng)目Web取決于MyControls,接著再為Web項(xiàng)目添加MyControls的引用(編譯成的MyControls.dll文件后被copy到Web目錄的Bin文件夾下,你可以在任何地方使用這個(gè)MyControls.dll文件)。
在MyControls項(xiàng)目中添加一個(gè)Web ASP.NET自定義控件并命名為MyControl.cs,接著在Web項(xiàng)目中的WebForm1.aspx文件首行添加如下代碼(用于向頁面注冊(cè)此控件):
﹤%@ Register TagPrefix="ccs" Namespace="MyControls" Assembly="MyControls" %﹥
在﹤Form﹥標(biāo)記之間添加如下代碼(添加此控件到頁面上):
﹤ccs:MyControl id="Control1" runat="server" Text="Hello World"﹥﹤/ccs:MyControl﹥
OK,一個(gè)帶有Text屬性的ASP.NET自定義控件已經(jīng)完成了,現(xiàn)在就可以運(yùn)行它并觀看效果了。
這個(gè)控件的結(jié)果僅僅是將一行文本輸出到瀏覽器并顯示出來,但是我們平時(shí)所用到的控件,小到如Label,大到如DataGrid,都是基于這一原理開發(fā)出來的。接著我們看一下這個(gè)ASP.NET自定義控件源文件(MyControl.cs)的組成。
- using System;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.ComponentModel;
- namespace MyControls
- {
- // Attribute DefaultProperty指定組件的默認(rèn)屬性,ToolboxData指定當(dāng)從IDE工具中的
- //工具箱中拖動(dòng)自定義控件時(shí)為它生成的默認(rèn)標(biāo)記
- [DefaultProperty("Text"),
- ToolboxData("﹤{0}:MyControl runat=server﹥﹤/{0}:MyControl﹥")]
- //類MyControl派生自WebControl
- public class MyControl : System.Web.UI.WebControls.WebControl
- {
- private string text;
- //Attribute Bindable指定屬性是否通常用于綁定
- //Category指定屬性或事件將顯示在可視化設(shè)計(jì)器中的類別
- //DefalutValue用于指定屬性的默認(rèn)值
- [Bindable(true),
- Category("Appearance"),
- DefaultValue("")]
- public string Text
- {
- get
- {
- return text;
- }
- set
- {
- text = value;
- }
- }
- //重寫WebControl的Render方法,采用HtmlTextWriter類型的參數(shù)
- protected override void Render(HtmlTextWriter output)
- {
- //發(fā)送屬性Text的值到瀏覽器
- output.Write(Text);
- }
- }
- }
現(xiàn)在我們略略修改一下Render方法的輸出值,試著為輸出文本加上標(biāo)簽Span:
output.Write("﹤span﹥"+Text+"﹤/span﹥");
也可以用標(biāo)簽修飾文本的顯示:
output.Write("﹤span﹥﹤b﹥"+Text+"﹤/b﹥﹤/span﹥");
也可以添加更多的屬性來控制文本的輸出,在此基礎(chǔ)上就可以創(chuàng)作出豐富的UI控件。
有時(shí)候針對(duì)不同的項(xiàng)目我們可能要開發(fā)不同用項(xiàng)的服務(wù)器控件,比如說特殊用途的DataGrid;有時(shí)候我們可能會(huì)被要求開發(fā)一些常用的控件,比如說像Chart、TreeView、Menu等這一類通用控件。針對(duì)于此,你可能會(huì)有四種不同的選擇:
創(chuàng)建一個(gè)用戶控件,用它封裝其用戶界面 (UI) 的服務(wù)器控件,無需編寫任何額外的代碼。
開發(fā)一個(gè)編譯控件,該控件結(jié)合了兩個(gè)或多個(gè)現(xiàn)有控件的功能。例如,需要一個(gè)封裝一個(gè)按鈕和一個(gè)文本框的控件。可以使用復(fù)合控件來完成。
從現(xiàn)有控件中派生并重寫其屬性、方法或事件來自定義現(xiàn)有控件。
從基本控件類之一派生來創(chuàng)建自定義控件。
以上四種方式從難度上來講順序依次復(fù)雜,使用原則如前所述,只有當(dāng)前者達(dá)不到項(xiàng)目要求時(shí)才需考慮后者,一般來說,開發(fā)用戶ASP.NET自定義控件所使用的編程模型與后三個(gè)有著很大不同,它更類似于ASP.NET頁的開發(fā)。
本文我們簡單的描述了自定義控件的定義及使用情況,并且用VS.NET實(shí)際開發(fā)了一個(gè)(用于顯示一串文本字段的)屬于自己的自定義控件,你可以在自己的項(xiàng)目中使用它,也可以將其發(fā)布到互聯(lián)網(wǎng)上供人們下載使用,當(dāng)然現(xiàn)在控件MyControl所具的功能還不足以吸引用戶去使用,接下來我們會(huì)討論關(guān)于自定義控件的一些高級(jí)議題,包括定義屬性、維護(hù)狀態(tài)、處理回發(fā)數(shù)據(jù)、模版與數(shù)據(jù)綁定等內(nèi)容以提高它的可用性。
ASP.NET自定義控件開發(fā)的基本情況就向你介紹到這里,希望對(duì)你有所幫助。
【編輯推薦】