13.3 验证控件的类型
到目前为止,已经讨论了验证的相关理论。ASP.NET 2.0提供了5种验证控件,表13-1对此进行了描述。然后,将介绍每种控件的细节,首先是表格式概述。
13.3.1 类型表
表 13-1
控 件 名 |
适 用 情 况 |
RequiredFieldValidator |
为了避免空值,例如当用户输入密码以建立新账户时 |
RangeValidator |
为了检查输入的值是否在限制的范围内。例如,对于青年俱乐部,出生日期字段应该指示年龄小于18岁 |
CompareValidator |
为了检查两个字段是否包含相同的值。例如,当创建密码时,用户应该输入密码两次以确保用户正确记住它 |
RegularExpressionValidator |
为了检查输入是否匹配关于字符性质的模式,例如字母与数字、大写字母与小写字母、日期的长度和有效性 |
CustomValidator |
为了检查输入符合以代码编写的规则。这可以包括复杂的评估,例如检验授权号中的模式 |
13.3.2 RequiredFieldValidator控件
在前面的示例中看到过,RequiredFieldValidator控件检查输入不为空。如同在大多数数据库工作中一样,一个或多个空格将仍然被认为是一个值。同样,数据源控件或数据库可能添加一个默认值,而RequiredFieldValidator不会考虑这种情况。
当使用DropDownList时,将自动选择列表中的第一项,直到用户进行其他的选择。因此,这里存在一个违反的行为,即RequiredFieldValidator将在用户没有进行选择时也会通过验证。如果希望强制在DropDownList中进行选择,可以使用如下的代码添加新的项到列表的顶部,且该项中没有值:
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="SqlDataSource1"
DataTextField="pub_name"
DataValueField="pub_id"
AppendDataBoundItems="true">
<asp:ListItem Value="" Text="Please select an option"/>
</asp:DropDownList>
考虑NULL可能是合法值的情况。如果期望空字符串表示空值,则完全不会使用必要的字段验证控件,因为空值实际上是有效的值(在数据库中转换为NULL)。如果期望特定的值表示空值,例如NA或NULL,则只有在将空字符串认为是无效值时才使用必要的字段验证控件。使用数据源控件或数据绑定控件的OnUpdating,OnInserting或OnDeleting事件中的代码,将NA或NULL字符串在服务器上转换为空值。
13.3.3 CompareValidator控件
CompareValidator控件检查两个项是否相同,其中一项是ControlToValidate。可以对以下3种对象的其中一种建立比较:
● 另一个控件中的值
● 硬编码的值、值列表或一些范围类型的值
● 数据类型
CompareValidator控件具有用于上述情况的ControlToCompare和Operator属性。它也有一个下面列出的Type属性。
将一个输入控件与另一个输入控件进行比较是最常见的比较情况。当要求用户输入关键的信息并且希望让用户输入其两次以确保正确输入该值(例如,电子邮件地址)时,这种比较情况就会在许多站点中引发。另一种常见的比较情况发生在用户第一次输入密码时。因为密码字段中的值一般不显示(使用掩饰字符代替),用户无法直观地检查其准确性。第二次输入密码并使用CompareValidator可解决该问题。注意,新密码的输入文本框将出现两次,但只有一个验证控件。在这种情况下,ControlToCompare属性被设置为第二个输入控件,并且Operator一般设置为等于。
也可以针对给定值使用CompareValidator控件。这可能是一个值,例如较低安全性的情况,其中对进入页面的所有成员使用相同的密码。CompareValidator控件中的ControlToCompare属性没有任何值,而ValueToCompare属性中则有一个值。Operator属性将被设置为等于。CompareValidator控件也提供了定量比较的能力,其方法是设置运算符为小于、大于或一些类似的选项。这些选项使CompareValidator控件类似于RangeValidator控件的功能,但具有较少的灵活性。例如,CompareValidator可以检查对StartDate输入值在对EndDate.Last输入值之前发生;CompareValidator将检查数据类型。例如,如果要求用户输入出生日期,则可能有多种格式。Operator属性可以被设置为DataTypeCheck,并且Type被设置为DateTime。
注意:
如果无意中同时包括了ControlToCompare和ValueToCompare属性,则使用ControlToCompare。
13.3.4 RangeValidator控件
RangeValidator控件确保输入值在上界和下界之中。验证的输入值可以是数字、货币、日期或(很少的情况)字符串。除了上面讨论的常见属性,有3个测试属性需要设置:MinimumValue,MaximumValue和Type,Type表示数据类型。上界值和下界值包括在内,因此比较类似于>=和<=。如果它们的属性分别被设置为5和10,则输入5和10是可接受的。如果将接受具有小数值的数字,则选择Double类型。
RangeValidator控件也有违反的情况。如果输入控件中没有数据存在,则RangeValidator控件将不会验证输入,并且不会抛出验证失败。为了确保具有输入值,并且该值在范围内,则必须添加第二个验证控件:RequiredFieldValidator。这种设计支持可接受字段为空的情况。但是,如果用户确实输入了内容,它就必须有效。
日期的语法非常灵活。首先,设置Type为Date。然后,MaximumValue和MinimumValue的日期可以输入为YYYY/MM/DD,DD/MM/YY或DD/MM/YYYY。可以去除日和月的前置0。需要一些技巧才可以跨文化集成日期。大多数Web站点不接受本地格式的日期,因为需要具有相关的逻辑来在每种语言中分析它们。更为常见的情况是,需要日期、货币或类似的数据采用服务器文化的格式。条目的格式可以在输入页面上以文本的形式注明。如果尝试全局化(具有许多其他方面而不仅是日期格式的项目),则有3种单独的格式需要考虑: