用于显示 enum 值的ASP.NET 控件

分享于 

6分钟阅读

Web开发

  繁體

介绍

枚举非常重要。它们定义一组允许值,并为函数和方法提供类型检查参数的方法。 问题是枚举和用户界面之间存在一些差异。 所以我创建了 RadioButtonEnumListBoxEnum 控件,允许你将控件绑定到 Enum 自动键入。

背景

我已经手工构建了这些UI组件,并且意识到当. NET 框架可以完成时,我不应该将值和文本复制到 UI。

使用代码

你在代码中看到的频率有多高:

PublicEnum Genders
 Male
 FemaleEndEnum

因此,接口组件如下:

<asp:RadioButtonListID="RadioButtonList1"runat="server"><asp:ListItemValue="0"Text="Male"/><asp:ListItemValue="1"Text="Female"/></asp:RadioButtonList>

然后代码更改,例如:

PublicEnum Genders
 NotSpecified
 Male
 FemaleEndEnum

现在你的接口控件不匹配,现有值 1 ( 最初女性) 将显示为'男声',如果你尝试将 SelectedValue 绑定到 2 ( 女声)。

鏂规碜

我意识到,子类化 RadioButtonList 并告诉它从给定的数组中填充自己是相当简单 Enum 它实际上需要一些学习和实验,但是现在它可以工作了。 在我的例子中,我也对 ListBox 控件做了这样的操作,但是它可以很容易地复制到 DropDownList。 为了帮助使用,我将从枚举 inside 中获取值的所有代码放到 EnumHelper 类中,这可以从你自己的控件中重用。

首先,我创建了 RadioButtonList的子类:

PublicClass RadioButtonEnum
 Inherits RadioButtonList

然后,在你指定 enum的类型名的地方添加了一个 EnumType 属性。 虽然这对于一个全局 enum,如 System.DayOfWeek,但在我尝试了嵌入式类。比如。MyClass.MyEnum 时,它。 MSDN在MSDN中的一些测试和搜索表明,枚举类必须用'+'和非'。'来划分,因此应该把 EnumType 指定为 MyClass+MyEnum

当从模块(。除了当前模块之外) 添加 enum 时,还需要指定: 比如,如果 MyClass 处于 TestCode.DLL 具有 XXX的基命名空间,那么 enum 类型应该读取: XXX.MyClass+MyEnum,TestCode 请参见 http://msdn2.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx 了解更多信息。

命名问题

虽然获取 enum 类型的值和名称相当简单,但是代码中 enum 值的命名限制非常紧密- 字母数字和下划线是唯一允许的字符。 虽然 SendToCustomer的enum 值在代码中很好,但是在用户界面中使用这个值并不真正好。

为了解决这个问题,我添加了一个 FixNames 属性,可以设置为 true,以使用下划线或者CamelCase调整 enum 值到更易读的值。 因此,在控制中,SendToCustomer 变成了发送给客户。

然而,有些情况下,我们需要其他字符 比如 紧急 ! - 或者扩展字符集。 因此,我增加了查找 Description 属性的能力( System.ComponentModel.DescriptionAttribute )。

实际的enum 值项可以作为 Enum 键入,所以函数 GetEnumNames() 检查任何值是否具有 Description 属性,如果存在,则使用该值。 比如:

PublicEnum BookRatingWithDescription
 <Description("A <b>great</b> book!")> GreatBook
 <Description("Enjoyable read")> Enjoyable
 <Description("Not bad - ok")> OK
 Poor
 <Description("Where's the shredder?")> TerribleEndEnum
HTML技巧

一个有用的技巧是 Description 属性的文本可以包含HTML标签( 这与 RadioButtonEnum 一起工作,但不是 ListBoxEnum ),如第一个 enum 值 上面 中所示。

我还很多使用 XML,所以如果存在这些值,我添加了 XmlEnumAttribute 值,并且 UseXmlNames 属性被设置为 True

例子

为了测试这个,我已经包含了一个展示各种功能的网站。 以下是设计模式中的网页:

Design Mode

当页面显示时,控件会自动填充- hurray !

Browser Screenshot

在带有描述的enum 中,第一项使用描述中的HTML标记。 最后两个示例显示了相同的enum - 在第一个实例中 FixNames=False 而在第二个 FixNames=True

结束语

就是这样了- 不再将 enum 值复制到控件中。 希望你觉得有用。

历史记录

  • 版本 1.0: RadioButtonEnumListBoxEnum。 尽管使用in编写,但是通过将对. NET 1.x的引用更改为 1. x.,可以修改这个代码。

控制  asp  asp-net  disp  Controls  enum