4.1 数据验证控件
ASP.NET提供了一组验证控件,对客户端用户的输入进行验证。在验证数据时,网页会自动生成相关的JavaScript代码,这样不仅响应速度快,而且网页设计人员也不需要额外缩写JavaScript脚本代码。
注意
ASP.NET提供的验证控件是在客户端进行验证。为了保证程序的正确性,应该对数据进行客户端验证和服务器端验证。
在Visual Studio 2015工具箱的“验证”选项卡上,可以看到一组数据验证控件,如图4.1所示。
图4.1 验证控件
下面介绍数据验证控件的使用方法。
4.1.1 非空数据验证控件
当某个字段不能为空时,可以使用非空数据验证控件(RequiredFieldValidator),该控件常用于文本框的非空验证。在网页提交到服务器前,该控件验证控件的输入值是否为空,如果为空,则显示错误信息和提示信息。RequiredFieldValidator控件的部分常用属性及说明如表4.1所示。
表4.1 RequiredFieldValidator控件的常用属性及说明
下面对比较重要的属性进行详细介绍。
ControlToValidate属性
ControlToValidate属性指定验证控件对哪一个控件的输入进行验证。
例如,要验证TextBox控件的ID属性为txtPwd,只要将RequiredFieldValidator控件的ControlToValidate属性设置为txtPwd,代码如下:
this.RequiredFieldValidator1.ControlToValidate = "txtUserName";
ErrorMessage属性
ErrorMessage属性用于指定页面中使用RequiredFieldValidator控件时显示的错误消息文本。
例如,将RequiredFieldValidator控件的错误消息文本设为“*”,代码如下:
this.RequiredFieldValidator1.ErrorMessage = "*";
【例4.1】 非空数据验证。(示例位置:TM\sl\04\01)
本示例主要通过RequiredFieldValidator控件的Control-ToValidate属性验证TextBox控件的文本值是否为空。执行程序,如果TextBox控件中内容为空,单击“验证”按钮,示例运行结果如图4.2所示。
图4.2 非空数据验证
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加1个TextBox控件、1个RequiredFieldValidator控件和1个Button控件,它们的属性设置及用途如表4.2所示。
表4.2 Default.aspx页控件的属性设置及用途
注意
ASP.NET中使用的验证控件是在客户端对用户的输入内容进行验证。
4.1.2 数据比较验证控件
比较验证将输入控件的值同常数值或其他输入控件的值相比较,以确定这两个值是否与比较运算符(小于、等于、大于等)指定的关系相匹配。
数据比较验证控件(CompareValidator)的部分常用属性及说明如表4.3所示。
表4.3 CompareValidator控件的常用属性及说明
说明
如果比较的控件均为空值,则网页不会调用CompareValidator控件进行验证。这时,应使用RequiredFieldValidator控件防止输入空值。
下面对比较重要的属性进行详细介绍。
ControlToCompare属性
ControlToCompare属性指定要对其进行值比较的控件的ID。
例如,ID属性为txtRePwd的TextBox控件与ID属性为txtPwd的TextBox控件进行比较验证,代码如下:
this. CompareValidator1.ControlToCompare= "txtPwd"; this. CompareValidator1. ControlToValidate = "txtRePwd";
Operator属性
Operator属性指定进行比较验证时使用的比较操作。ControlToValidate属性必须位于比较运算符的左边,ControlToCompare属性位于右边,才能有效进行计算。
例如,要验证ID属性为txtRePwd的TextBox控件与ID属性为txtPwd的TextBox控件是否相等,代码如下:
this.CompareValidator1.Operator = ValidationCompareOperator.Equal;
Type属性
Type属性指定要对其进行比较的两个值的数据类型。
例如,要验证ID属性为txtRePwd的TextBox控件与ID属性为txtPwd的TextBox控件的值类型为string类型,代码如下:
this.CompareValidator1.Type = ValidationDataType.String;
ValueToCompare属性
ValueToCompare属性指定要比较的值。如果ValueToCompare和ControlToCompare属性都存在,则使用ControlToCompare属性的值。
例如,设置比较的值为“你好”,代码如下:
this.CompareValidator1.ValueToCompare = "你好";
【例4.2】 值比较验证。(示例位置:TM\sl\04\02)
本示例主要通过CompareValidator控件的ControlTo-Validate属性和ControlToCompare属性验证用户输入的密码与确认密码是否相同。执行程序,如果密码与确认密码中的值不同,单击“验证”按钮,示例运行结果如图4.3所示。
图4.3 值比较验证
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加3个TextBox控件、1个RequiredFieldValidator控件、1个CompareValidator控件和1个Button控件,它们的属性设置及用途如表4.4所示。
表4.4 Default.aspx页控件的属性设置及用途
4.1.3 数据类型验证控件
CompareValidator控件还可以对照特定的数据类型来验证用户的输入,以确保用户输入的是数字、日期等。例如,如果要在用户信息页上输入出生日期信息,就可以使用CompareValidator控件确保该页在提交之前对输入的日期格式进行验证。
【例4.3】 数据类型验证。(示例位置:TM\sl\04\03)
本示例主要通过CompareValidator控件的ControlToValidate、Operator和Type属性验证用户输入的出生日期与日期类型是否匹配。执行程序,如果出生日期不是日期类型,单击“验证”按钮,示例运行结果如图4.4所示。
图4.4 数据类型验证
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加4个TextBox控件、1个RequiredFieldValidator控件、2个CompareValidator控件和1个Button控件,它们的属性设置及用途如表4.5所示。
表4.5 Default.aspx页控件的属性设置及用途
注意
使用验证控件(不包括自定义验证控件)时,应该首先设置其ControlToValidate属性(必须设置),以避免因未指定验证控件ID而产生的错误。
4.1.4 数据格式验证控件
使用数据格式验证控件(RegularExpressionValidator)可以验证用户输入是否与预定义的模式相匹配,这样就可以对电话号码、邮编、网址等进行验证。RegularExpressionValidator控件允许有多种有效模式,每个有效模式使用“|”字符来分隔。预定义的模式需要使用正则表达式定义。
RegularExpressionValidator控件部分常用属性及说明如表4.6所示。
表4.6 RegularExpressionValidator控件常用的属性及说明
RegularExpressionValidator控件的属性与RequiredFieldValidator控件大致相同,这里只对ValidationExpression属性进行具体介绍。
ValidationExpression属性用于指定验证条件的正则表达式。在RegularExpressionValidator控件的属性面板中,单击ValidationExpression属性输入框右边的按钮,将弹出“正则表达式编辑器”对话框,在其中列出了一些常用的正则表达式,如图4.5所示。
图4.5 正则表达式编辑器
常用的正则表达式字符及含义如表4.7所示。
表4.7 常用的正则表达式字符及含义
下面列举几个常用的正则表达式。
(1)验证电子邮件
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*。
\S+@\S+\.\S+。
(2)验证网址
HTTP://\S+\.\S+。
http(s)? ://([\w-]+\.)+[\w-]+(/[\w- ./? %&=]*)?。
(3)验证邮政编码
\d{6}。
(4)其他常用正则表达式
[0-9]:表示0~9十个数字。
\d*:表示任意个数字。
\d{3,4}-\d{7,8}:表示中国大陆的固定电话号码。
\d{2}-\d{5}:验证由两位数字、一个连字符再加5位数字组成的ID号。
<\s*(\S+)(\s[^>]*)? >[\s\S]*<\s*\/\l\s*>:匹配HTML标记。
【例4.4】 数据格式验证。(示例位置:TM\sl\04\04)
本示例主要通过RegularExpressionValidator控件的ControlToValidate、Operator和Type属性验证用户输入的出生日期与日期类型是否匹配。执行程序,如果出生日期不是日期类型,单击“验证”按钮,示例运行结果如图4.6所示。
图4.6 数据格式验证
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加5个TextBox控件、1个RequiredFieldValidator控件、2个CompareValidator控件和1个Button控件,它们的属性设置及用途如表4.8所示。
表4.8 Default.aspx页控件属性设置及用途
说明
RegularExpressionValidator控件在客户端使用的应该是JScript正则表达式语法。
4.1.5 数据范围验证控件
使用数据范围验证控件(RangeValidator)验证用户输入是否在指定范围之内,可以通过对RangeValidator控件的上、下限属性以及指定控件要验证的值的数据类型进行设置完成这一功能。如果用户的输入无法转换为指定的数据类型,如无法转换为日期,则验证将失败。如果用户将控件保留为空白,则此控件将通过范围验证。若要强制用户输入值,则还要添加RequiredFieldValidator控件。
一般情况下,输入的月份(1~12)、一个月中的天数(1~31)等,都可以使用RangeValidator控件对数据的范围进行限定以保证用户输入数据的准确性。
RangeValidator控件部分常用属性及说明如表4.9所示。
表4.9 RangeValidator控件的常用属性及说明
下面对比较重要的属性进行详细介绍。
MaximumValue和MinimumValue属性
MaximumValue和MinimumValue属性指定用户输入范围的最大值和最小值。
例如,要验证用户输入的值在20~70之间,代码如下:
this. RangeValidator1. MaximumValue= "70"; this. RangeValidator1. MaximumValue= "20";
Type属性
Type属性用于指定进行验证的数据类型。在进行比较之前,值被隐式转换为指定的数据类型。如果数据转换失败,数据验证也会失败。
例如,将RequiredFieldValidator控件的错误消息文本设为“*”,代码如下:
this. RangeValidator1.Type = ValidationDataType.Integer;
【例4.5】 数据范围验证。(示例位置:TM\sl\04\05)
本示例主要通过RangeValidator控件的ControlToValidate、MinimumValue、MaximumValue和Type属性验证用户输入的数学成绩是否在0~100之间。执行程序,如果输入的数学成绩不在规定范围内或不符合数据类型要求,单击“验证”按钮,示例运行结果如图4.7所示。
图4.7 数据范围验证
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加2个TextBox控件、1个RangeValidator控件和1个Button控件,它们的属性设置及用途如表4.10所示。
表4.10 Default.aspx页控件属性设置及用途
注意
使用RangeValidator控件时,必须保证指定的MaximumValue或MinimumValue属性值类型能够转换为Type属性设定的数据类型,否则会出现异常。
4.1.6 验证错误信息显示控件
使用验证错误信息显示控件(ValidationSummary)可以为用户提供将窗体发送到服务器时所出现错误的列表。错误列表可以通过列表、项目符号列表或单个段落的形式进行显示。
ValidationSummary控件中为页面上每个验证控件显示的错误信息,是由每个验证控件的ErrorMessage属性指定的。如果没有设置验证控件的ErrorMessage属性,将不会在ValidationSummary控件中为该验证控件显示错误信息。还可以通过设置HeaderText属性,在ValidationSummary控件的标题部分指定一个自定义标题。
通过设置ShowSummary属性,可以控制ValidationSummary控件是显示还是隐藏,还可通过将ShowMessageBox属性设置为true,在消息框中显示摘要。
ValidationSummary控件的常用属性及说明如表4.11所示。
表4.11 ValidationSummary控件的常用属性及说明
下面对比较重要的属性进行详细介绍。
DisplayMode属性
使用DisplayMode属性指定ValidationSummary控件的显示格式。摘要可以按列表、项目符号列表或单个段落的形式显示。
例如,设置ValidationSummary的显示模式为项目符号列表,代码如下:
this.ValidationSummary1.DisplayMode = ValidationSummaryDisplayMode.BulletList;
ShowMessageBox属性
当ShowMessageBox属性设为true时,网页上的错误信息不在网页本身显示,而是以弹出对话框的形式来显示错误信息,如图4.8所示。
图4.8 弹出对话框
ShowSummary属性
除了ShowMessageBox属性外,ShowSummary属性也可用于控制验证摘要的显示位置。如果该属性设置为true,则在网页上显示验证摘要。
注意
如果ShowMessageBox和ShowSummary属性都设置为true,则在消息框和网页上都显示验证摘要。
【例4.6】 验证错误信息显示。(示例位置:TM\sl\04\06)
本示例主要通过ValidationSummary控件将错误信息的摘要一起显示。执行程序,如果姓名为空,并且输入的数学成绩不在规定范围内或不符合数据类型要求,单击“验证”按钮,示例运行结果如图4.9所示。
图4.9 验证错误信息显示
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加2个TextBox控件、1个RangeValidator控件和1个Button控件等,它们的属性设置及用途如表4.12所示。
表4.12 Default.aspx页控件属性设置及用途
说明
使用ValidationSummary控件能够集中呈现错误信息。
4.1.7 自定义验证控件
如果现有的ASP.NET验证控件无法满足需求,那么可以自定义一个服务器端验证函数,然后使用自定义验证控件(CustomValidator)来调用该函数。
【例4.7】 自定义验证控件。(示例位置:TM\sl\04\07)
本示例主要通过使用CustomValidator控件实现服务器端验证,此时只需将验证函数与ServerValidate事件相关联。执行程序,如果输入的数字不是偶数或不符合数据类型要求,单击“验证”按钮,示例运行结果如图4.10所示。
图4.10 验证错误信息显示
程序实现的主要步骤如下。
新建一个网站,默认主页为Default.aspx,在Default.aspx页面上添加1个TextBox控件、1个CustomValidator控件和1个Button控件,它们的属性设置及用途如表4.13所示。
表4.13 Default.aspx页控件的属性设置及用途
Default.aspx页面中的相关代码如下:
<asp:TextBox ID="txtNum" runat="server" Width="100px"></asp:TextBox> <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="您输入的不是偶数" ControlToValidate="txtNum" OnServerValidate="ValidateEven"></asp:CustomValidator> <asp:Button ID="btnCheck" runat="server" Text="验证" />
Default.aspx.cs页面中CustomValidator控件的ServerValidate事件(这里命名为ValidateEven)相关代码如下:
public void ValidateEven(Object sender, ServerValidateEventArgs args) { try { if ((Convert.ToInt32(args.Value) % 2) == 0) { args.IsValid = true; } else { args.IsValid = false; } } catch (Exception e) { args.IsValid = false; } }
技巧
(1)Page对象的IsValid属性
验证控件列表和执行验证的结果是由Page对象来维护的。Page对象具有一个IsValid属性,如果验证测试成功,属性返回true;如果有一个验证失败,则返回false。IsValid属性可用于了解是否所有验证测试均已成功。接着,可将用户重定向到另一个页面或向用户显示适当的信息。
(2)RangeValidator控件提供的验证类型
RangeValidator控件提供了以下5种验证类型。
Integer类型:用来验证输入是否在指定的整数范围内。
String类型:用来验证输入是否在指定的字符串范围内。
Date类型:用来验证输入是否在指定的日期范围内。
Double类型:用来验证输入是否在指定的双精度实数范围内。
Currency类型:用来验证输入是否在指定的货币值范围内。