第三章 用检验控件执行表单的验证
第三章 用检验控件执行表单的检验
主要内容:
l 使用客户端检验
l 必填域控件:RequiredFieldValidator
l 检验表达式控件:RegularExpressionValidator
l 比较值控件:CompareValidator
l 检查值范围控件:RangeValidator
l 错误汇总控件:ValidatorSummary
l 自定义检验控件:CustomValidator
l 禁用检验
一、 使用客户端检验
传统上,Web开发人员可以,在服务器端添加表单检验子例程,也可以在客户端代码中添加检验子例程。
客户端检验逻辑的优点是,可以向用户提供快速的反馈。
用户一般比较喜欢客户端检验。
但问题是,并不是所有浏览器都能工作(不是所有浏览器都支持JavaScript)
而,将表单检验逻辑添加到服务器端代码,可以适合任何浏览器,操作更可靠。
ASP.NET检验控件会自动产生客户端和服务器端代码。(如果浏览器支持JavaScript,客户端检验脚步被自动发送到浏览器;如果不支持,自动在服务器端代码实现检验子例程)
这里所述的客户端检验代码只在微软IE4.0以上浏览器有效。(在任何的Navigator都无效)
(一) 配置客户端检验
检验控件要使用一个JavaScript脚本库。(在安装.NET框架时自动安装)
此库位于WebUIValidation.js文件中。(默认此文件在Web服务器wwwroot目录下的aspnet_client目录中)(若找不到此文件,会收到错误”Warning! Unable to find script library ‘WebUIValidation.js’”
注意:WebUIValidation.js文件的准确位置是由你的Machine.config文件决定的,在<webControlsclientScriptsLocation>部分。 |
使用aspnet_regiis命令行工具,可以安装和卸载脚本库。
Aspnet_regiis –c安装脚本库
Aspnet_regiis –e卸载脚本库
此工具位于你的"winnt"microsoft.net"framework"[version]"目录
(二) 启用和禁用客户端检验
如果,你请求包含检验控件的页面,并且使用IE4.0以上浏览器,那么JavaScript代码就会自动发送到你的浏览器。
l 禁用客户端表单检验,只需在页面顶端添加指令:
<%@ Page ClientTarget=”downlevel” %>
这个指令,不但禁用客户端的表单检验,还会阻止页面上所有ASP.NET控件显示任何非HTML 3.2 兼容的内容(比如页面上表现级联样式表的属性)
注意:ClientTarget属性对应于machine.config文件的<clientTarget>条目,它接受一个字符串值。其中uplevel被定义为IE4.0;downlevel被定义为Unknow browser(即假设不支持级联样式表) |
l 禁用各检验控件的客户端检验,可以通过将EnableClientScript属性设为False。(此属性不是所有检验控件共享的,所有可以禁用特定检验控件)
二、 必填域控件:RequiredFieldValidator
可以检查一个控件是否有值。(通常对TextBox控件使用,对其他输入控件也没问题)
属性 |
说明 |
ControlToValidate |
指定要检验的控件的ID |
Display |
设置如何显示Text属性中包含的错误信息。 有效值:Static(默认)、Dynamic、None。 |
EnableClientScript |
启用或禁用客户端表单检验。默认True |
Enable |
同时,启用或禁用,服务器和客户端检验。默认true |
ErrorMessage |
指定在ValidationSummary控件中显示的错误消息。 若Text属性未被设置,检验控件显示这个错误消息。 |
InitialValue |
获取或设置ControlToValidate属性指定的控件的初始值。 |
IsValid |
当成功通过检验是,此为true;否则为false |
Text |
设置控件显示的错误消息 |
方法:
Validate——执行检验并更新IsValide属性
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server"> Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("Thankyou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> 用户名:<br /><asp:TextBox ID="txtUsername" runat="server"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="RequiredFieldValidator" ControlToValidate="txtUsername" Text="必须键入用户名"></asp:RequiredFieldValidator><p />
注释:<br /><asp:TextBox ID="txtComments" runat="server" textmode="MultiLine"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="RequiredFieldValidator" ControlToValidate="txtComments" Text="请输入注释"></asp:RequiredFieldValidator> <p />
<asp:Button ID="Button1" runat="server" Text="submit" OnClick="Button1_Click" /> </div> </form> </body> </html> |
注意此句If IsValid Then,其中IsValid是Page对象属性,只有当页面上每个检验控件的IsValid属性都为true,Page.IsValid属性才为true。(也可以检查每个检验控件的IsValid属性)
RequiredFieldValidator控件显示的错误消息由其Text属性决定,默认为红色字体,可以通过格式化属性控制它。还可以通过修改Display属性控制如何显示错误消息。
默认情况下,即使不显示错误消息,错误消息的实际屏幕显示也会被保留,但是如果将Display属性设置为Dynamic,错误消息会推开它周围的任何内容。
与初始值相比较
在RequiredFieldValidator控件中,可以检查用户输入的值是否与初始值不同。
这是可以使用其InitialValue属性。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("ThankYou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>RequiredFieldValidatorInitialValue.aspx</title> </head> <body> <form id="form1" runat="server"> <div> 注释:<br /> <asp:TextBox ID="txtComments" TextMode="MultiLine" Text="输入内容" runat="server" /> <asp:RequiredFieldValidator ID="rfv1" ControlToValidate="txtComments" Text="输入文字。。。" initialValue="输入内容" runat="server" /><%--注意initialValue应该与关联的TextBox.text内容一致--%> <p /> <asp:Button ID="btn1" Text="提交" runat="server" OnClick="btn1_Click" /> </div> </form> </body> </html> |
三、 检验表达式的控件RegularExpressionValidator
RegularExpressionValidator控件可以,将表单域中输入的值和一个正则表达式,相匹配。(例如:检验有效的电子邮件地址、电话号码或用户名、口令等)
特殊属性:ValidationExpression——用来指定执行检验时使用的正则表达式。
注意:正则表达式在JavaScript和.NET框架中表现略有不同。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("ThankYou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>RegularExpressionValidator.aspx</title> </head> <body> <form id="form1" runat="server"> <div> 产品代码:<br /> <asp:TextBox ID="txtProductCode" runat="server"></asp:TextBox> <asp:RegularExpressionValidator ControlToValidate="txtProductCode" ValidationExpression="P[0-9]{4}" ID="RegularExpressionValidator1" runat="server" ErrorMessage="RegularExpressionValidator"></asp:RegularExpressionValidator> <asp:Button ID="Button1" runat="server" Text="Submit" OnClick="Button1_Click" /></div> </form> </body> </html> |
同一个控件可以与多个检验控件相关联。
(一) 检验电子邮件地址
在执行表单检验时,最常见和最困难的检验任务之一是:检验电子邮件地址。
(二) 检验用户名和口令
通常的用户名和口令,只包含字母、数字或下划线。
可以使用的正则表达式如下:"w+
这个正则表达式匹配任何(包含一个或多个单词字符【字母、数字、下划线】的表达式)
若要限定口令的最小和最大长度,表达式如下:"w{8,20}
若口令中至少使用一个数组或一个字母,看如下表达式:
[a-zA-Z]+"w*"d+"w*
这个表达式要求,至少输入一个字母,后跟任意单词字符,然后至少一个数字,然后跟任意单词字符
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("ThankYou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> 密码:<br /> <asp:TextBox ID="txtPassword" Columns="30" runat="server" /> <asp:RequiredFieldValidator ID="rfv1" ControlToValidate="txtPassword" Display="Dynamic" Text="必须输入密码" runat="server" /> <asp:RegularExpressionValidator ID="revPassword" ControlToValidate="txtPassword" Display="Dynamic" Text="输入密码需要3到20个字符" ValidationExpression=""w{3,20}" runat="server" /> <asp:RegularExpressionValidator ID="revPassword2" ControlToValidate="txtPassword" Display="Dynamic" Text="密码必须是含有至少一个字母或数字" ValidationExpression="[a-zA-Z]+"w*"d+"w*" runat="server" /> <p /> <asp:Button ID="btnSubmit" Text="Submit" runat="server" OnClick="btnSubmit_Click" /> </div> </form> </body> </html> |
(三) 检验电话号码
(四) 检验网址
http://"S+"."S+【此处要注意s字母的大小写】
它匹配,必须以http://开头,后跟任意个非空格字符,然后一个点,最后是任意个非空格字符。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("thankyou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> 输入网址:<br /> <asp:TextBox ID="txtUrl" columns="50" runat="server" /> <asp:RegularExpressionValidator ID="revUrl" ControlToValidate="txtUrl" Display="dynamic" Text="无效网址!" validationExpression="http://"S+"."S+" runat="server" /> <p /> <asp:Button ID="btn1" Text="提交" runat="server" OnClick="btn1_Click" /> </div> </form> </body> </html> |
这里要注意大小写敏感问题。http://www.163.com可以匹配,但是HTTP://www.163.com不能匹配。
而且,RegularExpressionValidator控件【没有可以用来启用正则表达式选项的属性】。
四、 比较值控件CompareValidator(比较内容可以是固定值或控件的输入值)
l 属性
属性 |
说明 |
ControlToCompare |
|
ControlToValidate |
|
Display |
|
EnableClientScript |
客户端表单检验,默认True |
Enabled |
|
ErrorMessage |
|
IsValid |
|
Operator |
比较时使用的比较操作符,可能值为 Equal NotEqual GreaterThan GreaterThanEqual LessThan LessThenEqual DataTypeCheck |
Text |
|
Type |
比较【值】时,使用的数据类型。Currency、Date、Double、Integer、String |
ValueToCompare |
值比较时,使用的值。 |
(一) 比较两个控件的值
假设,要比较两个日期,需要设置CompareValidator控件的
ControlToValidator、ControlToCompare、Operator和Type属性。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("thankyou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> 第一个日期:<asp:TextBox ID="txt1" Columns="8" runat ="server" Width="120px" /> <br /> 第二个日期:<asp:TextBox ID="txt2" Columns="8" runat="server" Width="120px" /> <br /> <br /> <asp:CompareValidator ID="cv1" ControlToValidate="txt2" ControlToCompare="txt1" Display="Dynamic" Text="第二个日期必须大于第一个日期" Operator="GreaterThan" type="Date" runat="server" /> </div> <div> <p /> <asp:Button ID="btn1" Text="提交" runat="server" OnClick="btn1_Click" /> </div> </form> </body> </html> |
注意:CompareValidator控件【并不检查】它要比较的控件是否真的输入了值。(若控件是空的,表单会忽略检验检查)
(二) 比较控件值和固定值
将固定值设置到控件的ValueToCompare属性。
(三) 执行数据类型检查
通过将控件的Operator属性设置为DataTypeCheck值,可以执行数据类型检查。
(注意:应该同时在Type属性设置相应的数据类型)
注意:此种检查,对于格式非常挑剔.
五、 检查值范围的控件RangeValidator
最大值和最小值可以是:日期、数值、货币或字符串。
l 属性
属性 |
说明 |
ControlToValidator |
|
Display |
|
EnableClientScript |
|
Enabled |
|
ErrorMessage |
|
IsValid |
|
MaximumValue |
|
MinimumValue |
|
Text |
|
Type |
|
注意:如果需要检查,输入值是否位于【其他表单域中的值】所决定的范围,应该使用CompareValidator。(CompareValidator控件允许比较不同控件的值)
六、 错误汇总控件ValidatorSummary
使用这个控件,可以在【希望的任何地方】总结所有错误。
l 重要属性
属性 |
说明 |
DisplayMode |
错误消息的格式。有效值BulletList、List和SingleParagraph |
EnableClientScript |
|
Enabled |
|
HeaderText |
顶部文本 |
ShowMessageBox |
|
ShowSummary |
|
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub btn1_Click(ByVal sender As Object, ByVal e As System.EventArgs) If IsValid Then Response.Redirect("thankyou.aspx") End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>无标题页</title> </head> <body> <form id="form1" runat="server"> <div> <asp:ValidationSummary ID="vs1" HeaderText="页面存在一些问题!" runat="server" /> <p></p> 用户名:<br /> <asp:TextBox ID="txt1" runat="server" /> <asp:RequiredFieldValidator ID="reqVal1" ControlToValidate="txt1" errorMessage="必须输入用户名" runat="server" /> <br /> 密码: <asp:TextBox ID="txt2" runat="server" /> <asp:RequiredFieldValidator ID="reqVal2" ControlToValidate="txt2" ErrorMessage="必须输入密码" runat="server" /> <asp:RegularExpressionValidator ID="regVal1" ControlToValidate="txt2" ValidationExpression="[0-9]{2,6}" ErrorMessage="密码位数在2到6之间" runat="server" /> <p /> <asp:Button ID="btn1" Text="提交" runat="server" OnClick="btn1_Click" /> </div> </form> </body> </html> |
注意:ValidationSummary控件显示的是各个检验控件的ErrorMessage属性。
不要将ErrorMessage和Text两种属性混淆了。通常,Text属性在表单域旁边显示错误消息;ErrorMessage属性在ValidationSummary中显示。
默认时,ValidationSummary在有符号的列表中显示错误。要做出修改,需要设置其DisplayMode属性。
七、 自定义检验控件CustomValidator
l 重要属性
ClientValidationFunction |
客户端检验函数的名称 |
ControlToValidate |
|
Display |
|
EnableClientScript |
|
Enabled |
|
ErrorMessage |
|
IsValid |
|
Text |
|
l 事件
ServerValidate 用于执行服务器端检验的函数
使用CustomValidator控件,通过编写子例程,可以在服务器端执行,也可以在客户端检验。
若要在服务器端检验,需要编写OnServerValidate(s As object,e as ServerValidateEventArgs)事件。
其中的第二个参数类型为ServerValidatorEventArgs,它具有两个参数:
l IsValid——为True时,表示成功通过检查
l Value——要检验控件的值。
警告:可以用于检查【空表单域】的惟一控件是RequiredFieldValidator,因为当被检验控件没有数据时,自定义的检验子例程不会被调用。 |
八、 禁用检验
在包含检验控件的表单上实现Cancel按钮的功能比较困难。
问题在于,客户端检验脚步会阻止与Cancel按钮相关联的任何子例程的执行。
解决此问题,需要使用Button、LinkButton和ImageButton控件的特殊属性【CausesValidation】。(可以在按钮点击时启用或禁用检验,需要将其设置为False)