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

时间:2021-10-21 20:39:10
ASP.NET自定义控件属性介绍自定义控件简单属性和复杂属性。

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

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

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

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

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

  asp:TextBox ID="TextBox1" Text="textbox控件" runat="server"/asp:TextBox

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

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

  (1)连字符的表现形式

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

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

  asp:DataList ID="DataList1" runat="server" SelectedItemStyle / EditItemStyle / /asp:DataList

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

  asp:DropDownList ID="DropDownList1" runat="server" asp:ListItemx/asp:ListItem asp:ListItemxx/asp:ListItem asp:ListItemxxx/asp:ListItem /asp:DropDownList

  下面得好好看

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

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

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

  1.1 定义枚举

  

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

  1.2定义复杂属性

  

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

  1.3 呈现控件

  

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

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

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

  

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

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

  

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. }
  9. }

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

  

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

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

  

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

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

  1.6 实现CustomAddress属性折叠效果

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

  

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

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

  

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

  试着在属性面板编辑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. }
  12. }

  编译后,回到原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. }
  10. }

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

  

  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类添加元数据,如下代码

  [ParseChildren(true)] public class Custom: Control { }

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

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

  1.10 解决属性面板的问题

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

  [ParseChildren(true)] [PersistChildren(false)] public class Custom: Control { }

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

  好了,简单的讲完了.

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

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

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