ASP.NET自定义控件属性浅析

开发 后端
ASP.NET自定义控件属性浅析主要向你介绍自定义控件简单属性和复杂属性,那么他们各是什么呢?让我们关注本文章。

ASP.NET自定义控件属性介绍自定义控件简单属性和复杂属性:

主题是是ASP.NET自定义控件属性,只当分享经验,希望对大家有帮助

我们根据属性的不同表现形式,把其区分为简单属性和复杂属性

下面来看下属性的表现形式

ASP.NET自定义控件属性之简单属性表现形式如下,

  1. ﹤asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"﹥﹤/asp:TextBox﹥ 

属性中含有子属性,称之为复杂对象,如Font属性

ASP.NET自定义控件属性之复杂属性的表现形式如下,

(1)连字符的表现形式

  1. ﹤asp:TextBox ID="TextBox1" Text="textbox控件" runat="server" Font-Bold="True"﹥﹤/asp:TextBox﹥ 

(2)内镶属性的表现形式,如定义样式

  1. ﹤asp:DataList ID="DataList1" runat="server"﹥  
  2.             ﹤SelectedItemStyle /﹥  
  3.             ﹤EditItemStyle /﹥  
  4.         ﹤/asp:DataList﹥ 

(3)内镶集合属性的表现形式,如DropDownList (先不介绍,大家可看MSDN)

  1. ﹤asp:DropDownList ID="DropDownList1" runat="server"﹥  
  2.             ﹤asp:ListItem﹥x﹤/asp:ListItem﹥  
  3.             ﹤asp:ListItem﹥xx﹤/asp:ListItem﹥  
  4.             ﹤asp:ListItem﹥xxx﹤/asp:ListItem﹥  
  5.         ﹤/asp:DropDownList﹥ 

下面得好好看

1,ASP.NET自定义控件属性之复杂属性基本使用方法

请看我是怎么做的,关于下面看到了一些元数据,如果你不熟悉,请参考MSDN.

下面一段代码记录一个custom的信息.

1.1 定义枚举

  1. using System;  
  2.  
  3. namespace CustomComponents  
  4. {  
  5.     /**//// ﹤summary﹥  
  6.     /// 职业  
  7.     /// ﹤/summary﹥  
  8.     public enum Metier  
  9.     {  
  10.         教师,程序员,作家  
  11.     }  

1.2定义复杂属性

  1. using System;  
  2. using System.ComponentModel;  
  3.  
  4. namespace CustomComponents  
  5. {  
  6.  
  7.  
  8.     /**//// ﹤summary﹥  
  9.     /// 地址集合  
  10.     /// ﹤/summary﹥  
  11.     public class Address  
  12.     {  
  13.         private String street = null;  
  14.         private String city = null;  
  15.         private String state = null;  
  16.         private String zip = null;  
  17.  
  18.         public String Street  
  19.         {  
  20.             get 
  21.             {  
  22.                 return street;  
  23.             }  
  24.             set 
  25.             {  
  26.                 street = value;  
  27.             }  
  28.         }  
  29.  
  30.  
  31.         public String City  
  32.         {  
  33.             get 
  34.             {  
  35.                 return city;  
  36.             }  
  37.             set 
  38.             {  
  39.                 city = value;  
  40.             }  
  41.         }  
  42.  
  43.         public String State  
  44.         {  
  45.             get 
  46.             {  
  47.                 return state;  
  48.             }  
  49.             set 
  50.             {  
  51.                 state = value;  
  52.             }  
  53.         }  
  54.  
  55.         public String Zip  
  56.         {  
  57.             get 
  58.             {  
  59.                 return zip;  
  60.             }  
  61.             set 
  62.             {  
  63.                 zip = value;  
  64.             }  
  65.         }  
  66.     }  

1.3 呈现控件

  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Web;  
  4. using System.Web.UI;  
  5.  
  6. namespace CustomComponents  
  7. {  
  8.     public class Custom: Control  
  9.     {  
  10.         private String name = null;  
  11.         Address address = new Address();  
  12.         private Metier metier;  
  13.         private int age = 0;  
  14.  
  15.         属性#region 属性  
  16.         [Description("年龄")]  
  17.         public int Age  
  18.         {  
  19.             get 
  20.             {  
  21.                 return age;  
  22.             }  
  23.             set 
  24.             {  
  25.                 age = value;  
  26.             }  
  27.         }  
  28.  
  29.         [Description("姓名")]  
  30.         public String Name  
  31.         {  
  32.             get 
  33.             {  
  34.                 return name;  
  35.             }  
  36.             set 
  37.             {  
  38.                 name = value;  
  39.             }  
  40.         }  
  41.  
  42.         [Description("职业")]  
  43.         public Metier CustomMetier  
  44.         {  
  45.             get 
  46.             {  
  47.                 return metier;  
  48.             }  
  49.             set 
  50.             {  
  51.                 metier = value;  
  52.             }  
  53.         }  
  54.         [Description("地址集合")]  
  55.         public Address CustomAddress  
  56.         {  
  57.             get 
  58.             {  
  59.                 return address;  
  60.             }  
  61.         }  
  62.  
  63.         #endregion  
  64.  
  65.         protected override void Render(HtmlTextWriter output)  
  66.         {  
  67.             output.Write("姓名: " + Name + "﹤br﹥");  
  68.             output.Write("年龄: " + Age + "﹤br﹥");  
  69.             output.Write("职业: " + CustomMetier + "﹤br﹥");  
  70.             output.Write("具体地址: " + CustomAddress.Street + "﹤br﹥ 城市: " 
  71.                 + CustomAddress.City + "﹤br﹥ 国籍: " +  
  72.                CustomAddress.State + "﹤br﹥ 邮编: " + CustomAddress.Zip + "﹤br﹥");  
  73.         }  
  74.     }  

1.4 在ASP.NET页面定义控件,

发现问题:属性不是有效属性,如下图

属性不是有效属性 

打开后台代码,输入如下代码检查属性,发现属性是存在的,如下图,再打开视图,发现控件能显示属性,***的就是不能认识属性为有效属性,在源视图也无法找到这几个属性.

无法找到这几个属性 

1.5 解决1.4无法显示有效属性的问题,(其实以上的测试已经实现复杂属性了).

解决方法:请在Custom类中的CustomAddress中加入一个元数据(元数据的解释请参考MSDN),如下

  1. [Description("地址集合")]  
  2. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  
  3. public Address CustomAddress  
  4. {  
  5.     get  
  6.     {  
  7.         return address;  
  8.     }  

再次打开源视图,发现编辑器已经支持此属性了,如下图,这样有点意思吧,呵呵

编辑器已经支持此属性 

虽然源视图上已经支持这个复杂属性了,打开属性面板,发现属性面板并不支持这个复杂属性(因为我们比较懒,不喜欢在源视图里编辑属性,想直接在属性面板编辑属性,下面就称复杂属性是CustomAddress),我们想要达到的效果,是让CustomAddress属性跟Font属性一样(可以折叠)显示在面板上,如下图

CustomAddress属性显示在面板 

发现问题:属性面板并不支持这个复杂属性

1.6 实现CustomAddress属性折叠效果

解决方法:给Address类添加一个元数据,如下

  1. [TypeConverter(typeof(ExpandableObjectConverter))]  
  2.     public class Address  
  3.     {. } 

编译后,再次打开属性面板,发现CustomAddress属性已经支持折叠效果,如下图

CustomAddress属性支持折叠效果 

试着在属性面板编辑CustomAddress的子属性,修改好子属性以后然后运行页面,发现子属性修改数据后无效

发现问题:在属性面板编辑复杂属性的子属性无效

1.7 解决属性面板编辑复杂属性的子属性无效的问题

解决方法:为Address类的每个属性加上一个元数据,如下

  1. [NotifyParentProperty(true)]  
  2. public String Street  
  3. {  
  4.     get 
  5.     {  
  6.         return street;  
  7.     }  
  8.     set 
  9.     {  
  10.         street = value;  
  11.     }  

编译后,回到原asp.net的页面,再次在属性面板里修改子属性,再次运行页面.发现修改后的数据生效了.

好了,以上代码就是连字符形式的复杂属性的实现,我们接着继续,我们希望把CustomAddress属性做为内镶属性使用,即如下代码的形式

  1. ﹤custom:custom id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21"﹥  
  2.  ﹤CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" /﹥  
  3.  ﹤/custom:custom﹥ 

发现问题:无法使用内镶属性

1.8 实现内镶属性

解决方法:在Custom类中给CustomAddress再加入一个元数据(第三个),如下

  1. [Description("地址集合")]  
  2. [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]  
  3. [PersistenceMode(PersistenceMode.InnerProperty)]  
  4. public Address CustomAddress  
  5. {  
  6.     get 
  7.     {  
  8.         return address;  
  9.     }  

打开源视图(请不要把原来的连字符属性去掉),在控件内部加入如下代码(编辑器已经支持此属性了)

  1. ﹤custom:custom      
  2. CustomAddress-Zip="3100001"  CustomAddress-City="杭州1"   
  3. CustomAddress-State="中国1" CustomAddress-Street="不告诉你1" 
  4.  id="Custom1" runat="server" name="Clingingboy" CustomMetier="教师" Age="21"﹥  
  5.  ﹤CustomAddress City="杭州" Street="不告诉你" State="中国" Zip="310000" /﹥  
  6.  ﹤/custom:custom﹥ 

发现问题:查看属性面板,再次修改CustomAddress子属性,然后运行,发现修改后无效果,而且显示的数据仍然是连字符属性的数据(非内镶属性的)

1.9 让ASP.NET控件支持内镶属性

解决方法:给Custom类添加元数据,如下代码

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

编译后,再次测试发现属性显示的优先级发生了变化,在内镶属性存在的时候,显示内镶属性,若其中有子属性不存在,则显示连字符属性,大家可以适当更改内镶属性和连字符属性测试变化.

发现问题:在属性面板改变属性时,仍然无法使修改后的数据生效,且修改后,数据退回初始的数据,并且导致内镶属性消失

1.10 解决属性面板的问题

解决方法:给Custom类再添加一个元数据,如下代码

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

编译后再次修改属性面板的值,发现修改的是内镶属性的数据,而且这次修改后数据没有丢失,运行后也是修改后的效果.

好了,简单的讲完了.

总结下:上面刚开始到1.3为止,其实效果已经实现了,接下来都是添加元数据,添加以后给我们带来的是方便.以上解决问题的办法全是套用元数据.可能上面的元数据大家很熟悉,在MSDN里面字面解释的也很清楚,但你去试验过吗?我相信这样的试验可以让你明白的更加深刻.

这次讲的虽然很简单(难得我把这么简单的东西变的这么复杂),主要是学习学习方法了但我还是希望对大家有帮助,上面如果哪里讲错了还请指出来^_^.

ASP.NET自定义控件属性的相关内容就向你介绍到这里,希望对你了解ASP.NET自定义控件属性有所帮助。

【编辑推荐】

  1. ASP.NET服务器控件之捕获回传事件浅析
  2. ASP.NET控件开发基础之事件处理浅析
  3. ASP.NET服务器控件之RenderContents简介
  4. ASP.NET服务器控件之RenderContents应用示例
  5. ASP.NET控件开发基础之RenderContents使用浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-10 14:16:59

ASP.NET自定义控

2009-07-28 09:32:41

ASP.NET自定义控

2009-08-06 17:52:45

ASP.NET控件开发自定义控件

2009-08-06 09:18:01

ASP.NET自定义控ASP.NET控件开发

2009-08-04 13:35:16

ASP.NET自定义样

2009-07-31 10:23:09

ASP.NET源码DateTimePic

2011-04-19 10:33:16

ASP.NET自定义控

2009-07-27 17:25:53

ASP.NET验证控件

2009-08-01 12:00:15

ASP.NET服务器自ASP.NET服务器ASP.NET

2009-08-05 17:58:53

自定义集合ASP.NET 2.0

2010-04-30 09:32:49

ASP.NET MVC

2009-07-29 09:34:54

IsPostBack属ASP.NET

2011-05-19 10:16:27

ASP.NET

2009-08-07 11:12:58

ASP.NET控件开发

2009-08-07 17:49:44

控件设计器

2009-08-07 15:24:16

ASP.NET模板控件

2009-08-01 09:21:12

ASP.NET服务器自ASP.NET服务器控ASP.NET

2009-08-12 14:38:05

ASP.NET Dat

2009-11-24 15:11:21

ASP.NET MVC

2009-08-07 17:59:35

控件设计器
点赞
收藏

51CTO技术栈公众号