自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ASP.NET控件開(kāi)發(fā)之控件生成器淺析

開(kāi)發(fā) 后端
ASP.NET控件開(kāi)發(fā)之控件生成器主要是指什么呢?ASP.NET控件開(kāi)發(fā)之控件生成器主要有那些需要注意的呢?那么本文就向你介紹這方面的內(nèi)容。

上一篇討論了為服務(wù)器控件添加客戶端功能,這一篇我們所要講的是控件生成器

ASP.NET控件開(kāi)發(fā)之控件生成器1.錯(cuò)誤的代碼,無(wú)法解析

首先來(lái)看一段簡(jiǎn)單的代碼

  1. 正確  
  2.            ﹤asp:Wizard ID="Wizard1" runat="server"﹥  
  3.                ﹤WizardSteps﹥  
  4.                    ﹤asp:WizardStep ID="WizardStep1" runat="server" Title="Step 1"﹥  
  5.                        21212﹤/asp:WizardStep﹥  
  6.                    ﹤asp:WizardStep ID="WizardStep2" runat="server" Title="Step 2"﹥  
  7.                    ﹤/asp:WizardStep﹥  
  8.                ﹤/WizardSteps﹥  
  9.            ﹤/asp:Wizard﹥  
  10.            錯(cuò)誤  
  11.            ﹤asp:Wizard ID="Wizard2" runat="server"﹥  
  12.                ﹤asp:WizardStep ID="WizardStep1" runat="server" Title="Step 1"﹥  
  13.                    21212﹤/asp:WizardStep﹥  
  14.                ﹤asp:WizardStep ID="WizardStep2" runat="server" Title="Step 2"﹥  
  15.                ﹤/asp:WizardStep﹥  
  16.            ﹤/asp:Wizard﹥  
  17.            ﹤br /﹥  
  18.            ﹤br /﹥  
  19.            ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥  
  20.                ﹤asp:TextBox ID="TextBox2" runat="server"﹥﹤/asp:TextBox﹥  
  21.            ﹤/asp:Label﹥  
  22.            ﹤br /﹥  
  23.            ﹤asp:TextBox ID="TextBox3" runat="server"﹥12345﹤/asp:TextBox﹥  
  24.            ﹤br /﹥  
  25.            ﹤asp:Label ID="Label2" runat="server" Text="Label"﹥12345﹤/asp:Label﹥  
  26.            ﹤br /﹥  
  27.            ﹤br /﹥  
  28.            ﹤asp:TextBox ID="TextBox1" runat="server"﹥  
  29.        ﹤asp:Label runat="server" Text="Label"﹥﹤/asp:Label﹥  
  30.            ﹤/asp:TextBox﹥ 

Wizard為asp.net2.0新增的一個(gè)控件,這個(gè)頁(yè)面發(fā)生兩個(gè)錯(cuò)誤,如下圖

頁(yè)面發(fā)生兩個(gè)錯(cuò)誤  

運(yùn)行此頁(yè)面后則會(huì)報(bào)錯(cuò),出現(xiàn)以下提示

ASP.NET控件開(kāi)發(fā)之控件生成器之分析器錯(cuò)誤

這里有一個(gè)問(wèn)題,.net提供我們控件時(shí),我們已經(jīng)形成一種定向思維,控件就是那樣寫的,如DropDownList,其中只能是套﹤asp:ListItem﹥的,那我為什么就不能套別的屬性呢?Wizard控件為什么就要加一個(gè)WizardSteps屬性才可以正常運(yùn)行呢?當(dāng)我們思考到這里,我們就該尋找答案.

ASP.NET控件開(kāi)發(fā)之控件生成器2.從ParseChildren元數(shù)據(jù)屬性講起

從第五篇開(kāi)始,我們多次用到了ParseChildren此特性.還請(qǐng)大家先看MSDN對(duì)其的解釋,其有三種情況

(1)ParseChildren(true)     第5篇我們使用集合屬性的時(shí)候我們?cè)?jīng)這樣定義,如下代碼

  1. [ParseChildren(true)]  
  2.  public class Custom: Control  
  3.  {  
  4.  } 

(2)ParseChildren(true,"﹤Default Property﹥") 第10篇當(dāng)我們定義集合屬性時(shí),我們?cè)@樣定義

DropItemList為集合屬性

  1. [ParseChildren(true"DropItemList")]  
  2. public class DropColor:WebControl  
  3.  {  

(3)ParseChildren(false)  這個(gè)我們沒(méi)用過(guò),也是我們要講的內(nèi)容,當(dāng)其內(nèi)部定義為flase時(shí),那么放在此控件內(nèi)的元素將被解析成控件,應(yīng)該說(shuō)是頁(yè)分析器ControlBuilder 類.這里大家可以看看MSDN文檔對(duì)ControlBuilder 類的解釋,至少要先知道這一點(diǎn)

默認(rèn)情況下,頁(yè)上的每個(gè)控件都與一個(gè)默認(rèn)的 ControlBuilder 類關(guān)聯(lián)。

下面我們慢慢看下來(lái).

ASP.NET控件開(kāi)發(fā)之控件生成器3.控件與集合屬性

讓我們?cè)俅位貞浺幌翽arseChildren的用法,本次的示例代碼取自asp.net2.0揭密

(1)ParseChildren(true,"﹤Default Property﹥")的使用

此控件實(shí)現(xiàn)效果為隨機(jī)顯示一個(gè)內(nèi)部控件內(nèi)容

RItem為一個(gè)繼承Control的控件,其內(nèi)部未實(shí)現(xiàn)任何東西,你可以在其控件內(nèi)部輸出呈現(xiàn),記得上面說(shuō)的ControlBuilder 類默認(rèn)關(guān)聯(lián)

ASP.NET控件開(kāi)發(fā)之控件生成器示例一

  1. [ParseChildren(true"Items")]  
  2. public class ItemRotator : CompositeControl  
  3. {  
  4.     private ArrayList _items = new ArrayList();  
  5.  
  6.     [Browsable(false)]  
  7.     public ArrayList Items  
  8.     {  
  9.         get { return _items; }  
  10.     }  
  11.  
  12.     protected override void CreateChildControls()  
  13.     {  
  14.         Random rnd = new Random();  
  15.         int index = rnd.Next(_items.Count);  
  16.         Control item = (Control)_items[index];  
  17.         this.Controls.Add(item);  
  18.     }  
  19. }  
  20.  
  21. public class RItem : Control  
  22. {  
  23.  

ASP.NET控件開(kāi)發(fā)之控件生成器頁(yè)面代碼

  1. ﹤custom:ItemRotator  
  2.     id="ItemRotator1" 
  3.     Runat="server"﹥  
  4.     ﹤custom:ritem ID="Item1" runat="server"﹥  
  5.         First Item  
  6.     ﹤/custom:ritem﹥  
  7.     ﹤custom:ritem ID="Item2" runat="server"﹥  
  8.         Second Item  
  9.         ﹤asp:Calendar  
  10.             id="Calendar1" 
  11.             Runat="server" /﹥  
  12.     ﹤/custom:ritem﹥  
  13.     ﹤custom:ritem ID="Item3" runat="server"﹥  
  14.         Third Item  
  15.     ﹤/custom:ritem﹥  
  16. ﹤/custom:ItemRotator﹥ 


效果就不說(shuō)了,隨機(jī)顯示ritem控件的內(nèi)容,注意以上控件定義了一個(gè)Items集合屬性

另外改進(jìn)的話就是我們第十篇的講的,為Ritem定義屬性,作為一個(gè)集合屬性,這里就不再列出代碼.

(1)ParseChildren(false)的使用

此控件未添加屬性,而多了一個(gè)方法AddParsedSubObject()

控件有默認(rèn)的頁(yè)面分析邏輯,重寫AddParsedSubObject方法,可以向控件添加子控件

ASP.NET控件開(kāi)發(fā)之控件生成器示例二

  1. [ParseChildren(false)]  
  2.  public class ContentRotator : WebControl  
  3.  {  
  4.  
  5.      protected override void AddParsedSubObject(object obj)  
  6.      {  
  7.          if (obj is Content)  
  8.              base.AddParsedSubObject(obj);  
  9.      }  
  10.  
  11.      protected override void RenderContents(HtmlTextWriter writer)  
  12.      {  
  13.          Random rnd = new Random();  
  14.          int index = rnd.Next(this.Controls.Count);  
  15.          this.Controls[index].RenderControl(writer);  
  16.      }  
  17.  }  
  18.  [  
  19.  ToolboxItem(false)  
  20.  ]  
  21.  public class Content : Control  
  22.  {  
  23.  } 

ASP.NET控件開(kāi)發(fā)之控件生成器頁(yè)面代碼

  1. ﹤custom:ContentRotator  
  2.         id="ContentRotator1" 
  3.         Runat="server"﹥  
  4.         ﹤custom:Content  
  5.             id="Content1" 
  6.             Runat="server"﹥  
  7.             顯示的***項(xiàng),此不為屬性      
  8.         ﹤/custom:Content﹥      
  9.         ﹤custom:Content  
  10.             id="Content2" 
  11.             Runat="server"﹥  
  12.             顯示的第二項(xiàng),此不為屬性  
  13.             ﹤asp:Calendar  
  14.                 id="Calendar1" 
  15.                 Runat="server" /﹥      
  16.         ﹤/custom:Content﹥      
  17.         ﹤custom:Content  
  18.             id="Content3" 
  19.             Runat="server"﹥  
  20.             顯示的第三項(xiàng),此不為屬性    
  21.         ﹤/custom:Content﹥    
  22.     ﹤/custom:ContentRotator﹥ 

注意:ContentRotator無(wú)任何屬性(其內(nèi)部添加的為控件),而是用AddParsedSubObject 方法向控件添加了子控件,而不像ItemRotator控件一樣,其內(nèi)部是屬性而非控件.

ASP.NET控件開(kāi)發(fā)之控件生成器4.修改默認(rèn)解析邏輯

上面已經(jīng)說(shuō)過(guò)每個(gè)控件都有默認(rèn)的解析邏輯,其通過(guò)ControlBuilder 類來(lái)實(shí)現(xiàn),可以通過(guò)重寫其方法來(lái)自定義解析邏輯.下面通過(guò)一個(gè)例子來(lái)說(shuō)明,它把一個(gè)控件以自定義標(biāo)簽所代替

以下列出部分代碼

ASP.NET控件開(kāi)發(fā)之控件生成器示例三

  1. //自定義頁(yè)分析器  
  2. public class ServerTabsBuilder : ControlBuilder  
  3. {  
  4.     public override Type GetChildControlType(string tagName, IDictionary attribs)  
  5.     {  
  6.         if (String.Compare(tagName, "tab"true) == 0)  
  7.             return typeof(ServerTab);  
  8.         else 
  9.             return null;  
  10.     }  
  11. }  
  12.  
  13. [ToolboxItem(false)]  
  14. public class ServerTab : Control  
  15. {  
  16.     private string _Text;  
  17.  
  18.     public string Text  
  19.     {  
  20.         get { return _Text; }  
  21.         set { _Text = value; }  
  22.     }  

(1)ServerTabsBuilder類重寫了ControlBuilder類的

GetChildControlType 方法  獲取與子標(biāo)記對(duì)應(yīng)的控件類型的 Type

在此方法中,其以tab標(biāo)簽代替了ServerTab控件,改寫了頁(yè)分析邏輯

ControlBuilder類常用的還有AllowWhitespaceLiterals 方法 其指定控件之間是否允許存在空白,大家可以重寫此方法,然后測(cè)試下就明白了

(2)定義一個(gè)簡(jiǎn)單的ServerTab控件.

還須在父控件中重寫AddParsedSubObject方法將ServerTab控件添加到子控件中

  1. protected override void AddParsedSubObject(object obj)  
  2. {  
  3.     if (obj is ServerTab)  
  4.         base.AddParsedSubObject(obj);  

(3)***還需要把控件生成器跟控件關(guān)聯(lián)起來(lái),當(dāng)然還要設(shè)置ParseChildren(false)

  1. [ControlBuilder(typeof(ServerTabsBuilder))]  
  2. [ParseChildren(false)]  
  3. public class ServerTabs : WebControl, IPostBackEventHandler  
  4. {  

好了,這里主要代碼就實(shí)現(xiàn)了,呈現(xiàn)代碼大家可在后面下載,下面看下頁(yè)面代碼

  1. ﹤%--以上省略css代碼--%﹥  
  2.     ﹤custom:ServerTabs  
  3.         ID="ServerTabs1" 
  4.         Runat="Server"﹥  
  5.         ﹤tab Text="First Tab"﹥  
  6.         ﹤asp:Label ID="Label1" runat="server" Text="Label"﹥﹤/asp:Label﹥  
  7.           Contents of the first tab  
  8.         ﹤/tab﹥      
  9.         ﹤tab Text="Second Tab"﹥  
  10.           Contents of the second tab  
  11.         ﹤/tab﹥      
  12.         ﹤tab Text="Third Tab"﹥  
  13.           Contents of the third tab  
  14.         ﹤/tab﹥      
  15.     ﹤/custom:ServerTabs﹥ 

以上鑲套代碼為tab標(biāo)簽,而非﹤custom:ServerTabs﹥﹤/custom:ServerTabs﹥,但實(shí)現(xiàn)效果是一樣的,只是我們改了默認(rèn)的頁(yè)分析邏輯,自定義了控件頁(yè)生成器(分析器)看下效果(當(dāng)重新編譯后需要重新啟動(dòng)vs2005才能看到效果)

自定義了控件頁(yè)生成器 

好了,這次的主題也講完了,這里需要注意的是asp.net2.0中復(fù)合控件只需要繼承CompositeControl類即可.

ASP.NET控件開(kāi)發(fā)之控件生成器方面的內(nèi)容那個(gè)就向你介紹到這里,希望對(duì)你了解ASP.NET控件開(kāi)發(fā)之控件生成器有所幫助。

【編輯推薦】

  1. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之類型轉(zhuǎn)換器淺析
  2. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之實(shí)現(xiàn)控件集合屬性
  3. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之自定義視圖狀態(tài)管理
  4. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之為子控件添加樣式
  5. ASP.NET控件開(kāi)發(fā)基礎(chǔ)之服務(wù)器控件客戶端功能
責(zé)任編輯:仲衡 來(lái)源: 博客園
相關(guān)推薦

2009-08-06 15:21:45

ASP.NET控件開(kāi)發(fā)RenderConte

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開(kāi)發(fā)

2009-07-28 16:21:03

Asp.net AjaAutoComplet

2009-08-06 18:18:27

ASP.NET控件開(kāi)發(fā)ASP.NET復(fù)合控件

2009-08-05 18:46:21

ComboBox顯示ASP.NET控件開(kāi)發(fā)

2009-08-05 17:11:51

ASP.NET控件開(kāi)發(fā)ASP.NET服務(wù)器控

2009-07-27 17:25:53

ASP.NET驗(yàn)證控件

2009-08-07 15:34:15

ASP.NET數(shù)據(jù)綁定

2009-08-05 18:32:28

HtmlTextWriASP.NET控件開(kāi)發(fā)

2009-08-06 17:52:45

ASP.NET控件開(kāi)發(fā)自定義控件

2009-08-07 17:41:07

ASP.NET Web

2009-07-28 09:32:41

ASP.NET自定義控

2009-08-07 17:49:44

控件設(shè)計(jì)器

2009-08-06 18:32:00

ASP.NET控件開(kāi)發(fā)ASP.NET復(fù)合控件

2009-08-06 13:08:23

ASP.NET控件開(kāi)發(fā)

2009-08-04 10:43:59

ASP.NET控件開(kāi)發(fā)

2009-08-07 16:32:52

ASP.NET控件設(shè)計(jì)時(shí)支

2009-08-04 15:20:59

ASP.NET數(shù)據(jù)驗(yàn)證數(shù)據(jù)驗(yàn)證控件

2009-08-07 17:59:35

控件設(shè)計(jì)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)