ASP.NET 2.0服务器控件之实现验证控件
1. 内置验证控件概述
验证控件完成对输入数据进行验证的功能。通过将验证控件和输入控件关联,开发人员可以向Web页面添加输入验证功能。另外,还提供了自定义验证规则的方法和自定义错误信息的内容和显示方式等。本节将概括性介绍ASP.NET内置验证控件。
ASP.NET 2.0共包含5个内置验证控件:RequiredFieldValidator、CompareValidator、RangeValidator、RegularExpressionValidator和CustomValidator,这些控件直接或者间接派生自System.Web.UI.WebControls.BaseValidator。每个验证控件执行特定类型的验证,并且当验证失败时显示自定义消息。下面简要介绍了这5个验证控件。
(1)RequiredFieldValidator控件
该控件用于确保被验证的控件中包含一个值。
(2)CompareValidator控件
该控件使用比较运算符(小于、等于、大于等)将用户输入与一个常量值或另一控件的属性值进行比较。
(3)RangeValidator控件
该控件用于检查用户的输入是否在指定的上下限内。可以检查数字对、字母字符对和日期对的范围。
(4)RegularExpressionValidator控件
该控件用于检查项与正则表达式定义的模式是否匹配。这种验证类型允许检查可预知的字符序列,如身份证号码、电子邮件地址、电话号码、邮政编码等中的字符序列。
(5)CustomValidator控件
该控件用于使用您自己编写的验证逻辑检查用户输入。这种验证类型允许检查在运行时导出的值。
除以上内置验证控件外,ASP.NET 2.0还提供了一个用于显示错误信息概要的控件ValidationSummary。该控件的目的是将来自页上所有验证控件的错误信息,一起显示在一个位置,例如,一个消息框或者一个错误信息列表。ValidationSummary控件不执行验证,但是它可以和所有验证控件一起使用,更准确的说,ValidationSummary可以和上述5个内置验证控件以及自定义验证控件,共同完成验证功能。
在Web页面中使用验证控件,我们需要注意以下几个关键的方面。
首先,将验证控件与输入控件关联起来,然后,根据不同类型验证控件的特征定义相关属性。例如:所有验证控件都要通过ContrlToValidate属性进行关联设置,都必须通过ErrorMessage属性定义错误信息内容;对于范围检查控件RangeValidator来讲,必须定义MaximumValue和MinimumValue属性来指定有效范围的最小值和最大值;对于模式匹配控件RegularExpressionValidator来讲,必须使用ValidationExpression属性指定用于验证输入控件的正则表达式。以上介绍的使用方式,很可能使得一个输入控件关联多个验证控件,这在ASP.NET 2.0中是允许的。
其次,ASP.NET 2.0中为验证控件提供了一个新属性ValidationGroup。开发人员可使用使用该属性将单个控件与验证组相关联,然后,使用多个ValidationSummary控件收集和报告这些组的错误。如果未指定验证组,则验证功能等效于ASP.NET 1.x中的验证功能。如果在多个控件中指定了多个验证组,则一定会显示多个验证摘要控件,因为一个验证摘要只显示一个组的验证错误。回发到服务器且当前具有CausesValidation属性的控件也引入了此ValidationGroup属性,该属性确定当控件导致回发时应当验证的控件组。如果未指定验证组,则会验证默认组,默认组由所有没有显式分配组的验证程序组成。
最后,一旦在Web页面中正确包含验证控件,那么开发人员就可以使用自己的代码来测试页或者单个验证控件的状态。例如,在使用输入数据之前来测试验证控件的IsValid属性。如果为true,表示输入数据有效;如果为false,表示输入错误,并显示错误信息。对于Web页面来讲,只有当所有验证控件的IsValid都为true,即所有输入数据都符合验证条件时,Page类的IsValid属性才设置为true,否则为false。另外,在页面级验证中,ASP.NET 2.0还提供了两个新方法来支持验证功能。一个是来自Page类的GetValidators方法,该方法将检索属于指定验证组的验证程序。还有一个也是来自Page类的Validate方法的重载,其允许采用验证组作为参数。
2. 验证控件实现机制
通常情况下,使用ASP.NET 2.0的5个内置验证控件,可以满足多数应用程序的需要。然而,为了提高开发的灵活性,满足不同Web应用的需求,ASP.NET 2.0内置了一个可扩充的验证框架。该框架定义了服务器端和客户端的基本实现规则。开发人员可以使用这个可扩充的验证框架,根据应用需要设计自己的验证控件来实现新的设计规则。
(1)服务器端实现机制
并非所有的Web服务器控件都支持验证控件。可以使用验证控件进行验证的标准控件包括:TextBox、ListBox、DropDownList、RadioButtonList、HtmlInputText、HtmlInputFile、HtmlSelect和HtmlTextArea、FileUpload和HtmlInputPassword等。这些支持验证控件的控件有一个共同特征,即元数据中包含System.Web.UI.ValidationPropertyAttribute。ValidationPropertyAttribute定义了控件用于标识验证属性的元数据特性。除此之外,如果由以上控件派生的自定义控件类,需要支持验证,那么必须在控件类前定义ValidationPropertyAttribute,这样该控件才能作为验证目标控件。开发人员在实现自定义验证控件过程中,必须首先了解以上所介绍的验证目标控件内容,然后才能更好的开发控件。
为了实现自定义验证控件,ASP.NET 2.0提供了3个重要对象:(1)System.Web.UI.IValidator;(2)System.Web.UI.WebControls.BaseValidator;(3)System.Web.UI.WebControls.CustomValidator。以上三者之间联系紧密,由它们组成的验证框架具有很强的灵活性和可扩充性。IValidator接口是验证框架的基础,任何实现该接口的类都可以作为验证程序。BaseValidator是抽象基类,该类实现IValidator接口,并继承System.Web.UI.WebControls.Label控件。通常情况下,自定义验证控件都派生自该类。CustomValidator实际是一个验证控件,开发人员可以用它来添加自定义的验证逻辑。为了更好的说明验证框架,下面将逐一介绍以上3个对象。
IValidator接口的定义如下:
public interface Ivalidator { string ErrorMessage {get; set;} bool IsValid {get; set;} void Validate(); } |
IValidator接口的成员包括1个方法和2个属性。ErrorMessage属性用于获取或设置条件验证失败时生成的错误信息。IsValid属性当由类实现时,获取或设置一个值,通过该值指示用户在指定控件中输入的内容是否通过验证。Validate方法由类实现时,计算它检查的条件并更新IsValid属性。对于开发人员来讲,如果实现的是一个普通验证程序,而非验证控件,那么可以通过实现该接口来完成。其原因在于验证框架的实现分布在Page类、BaseValidator类和验证目标控件中。这些类之间的相关性不允许任意实现IValidator接口。对于实现自定义验证控件,推荐的方法是继承BaseValidator类。
BaseValidator是验证框架中最为重要的部分。该类派生自Label类,并且实现IValidator接口。无论是内置验证控件,还是自定义验证控件,都必须派生自BaseValidator类。该类实现所有验证控件都必须实现的通用属性。下面介绍了一些常用验证属性。
· ControlToValidate属性
该属性值为String类型,其用于验证控件将计算的输入控件的编程ID。如果此为非法ID,则引发异常。
· Display属性
该属性值为ValidatorDisplay类型,其用于指定的验证控件的显示行为。此属性可以为下列值之一:(1)None—验证控件从不内联显示。如果希望仅在ValidationSummary控件中显示错误信息,则使用此选项。(2)Static—如果验证失败,验证控件显示错误信息。即使输入控件通过了验证,也在Web页中为每个错误信息分配空间。当验证控件显示其错误信息时,页面布局不变。由于页面布局是静态的,同一输入控件的多个验证控件必须占据页上的不同物理位置。(3)Dynamic—如果验证失败,验证控件显示错误信息。当验证失败时,在页上动态分配错误信息的空间。这允许多个验证控件共享页面上的同一个物理位置。注意:由于验证控件的空间是动态创建的,所以页面的物理布局会发生更改。为了防止页面布局在验证控件变得可见时更改,必须调整包含验证控件的HTML元素的大小,使其大得足以容纳验证控件的最大大小。
· ErrorMessage属性
该属性值为String类型,其用于当验证失败时,在ValidationSummary控件中显示的错误信息。如果未设置验证控件的Text属性,则验证失败时,验证控件中仍显示此文本。ErrorMessage属性通常用于为验证控件和ValidationSummary控件提供各种消息。注意:此属性不会将特殊字符转换为HTML实体。例如,小于号字符(<)不转换为<。这允许将HTML元素(如<IMG>元素)嵌入到该属性的值中
· IsValid属性
该属性值为bool类型,其用于指示ControlToValidate属性所指定的输入控件是否被确定为有效。
由该类派生的验证控件,可以不必再次实现以上通用属性,而只要根据应用需要另外定义一些属性和验证逻辑即可。例如,对于RangeValidator控件,除具有以上通用属性外,还定义了用于限定取值范围的MinimumValue和MaximumValue属性,以及用于指定要比较的值的数据类型的Type属性。此外,该控件的验证逻辑是通过重写BaseValidator.EvaluateIsValid方法实现的。由此看来,BaseValidator简化了自定义验证控件的实现过程,为控件开发人员提供了方便。
CustomValidator派生自BaseValidator类,它是5个内置验证控件之一。通常情况下,页面开发者使用CustomValidator来添加自定义的验证逻辑,这只要通过定义ServerValidate事件的事件处理方法以及ClientValidationFunction属性来完成。由于CustomValidator不提供复用机制(访问属性为public),因此自定义验证控件不能自该类派生。
(2)客户端实现机制
上文介绍了为实现验证控件,开发人员必须掌握的3个核心对象。掌握这些对象的定义和使用方法对于开发验证控件具有重要意义。通过它们,我们可以在服务器验证中添加验证逻辑。当页面回传时,验证目标控件的输入数据被发往服务器端参与验证逻辑。如果输入数据不能满足验证条件,那么页面将重新呈现,并且要求用户再次进行输入。整个验证过程可能需要多次往返,这样必然降低应用程序的易用性,并给服务器增加负担。
为了解决以上问题,开发人员必须学会为验证控件添加客户端验证机制。如果用户的浏览器支持DHTML和JavaScript技术,并且页面和验证控件的EnableClientScript均设置为true,那么就可以在客户端执行验证。客户端验证通过在向服务器发送用户输入前,检查用户输入、改变一些页面效果来增强验证过程。例如,通过在客户端检测输入错误,从而避免服务器端验证所需要的信息来回传递。服务器端验证总是要被执行的,这看起来好像是与客户端验证产生了重复,实际不然。出于安全考虑,如果某些用户通过手工提交恶意数据,而绕过客户端验证,那么服务器端验证的执行将对保护应用程序的安全性,甚至为服务器的安全性提供有力支持。
在ASP.NET 2.0中,如果开发人员使用内置验证控件实现验证功能,那么ASP.NET 2.0将自动产生相关的JavaScript代码。如果开发人员查看相关HTML源代码,那么将会发现有些来自WebResource.axd的JavaScript文件链接。然而,我们是无法查看相关文件代码的。这一点与ASP.NET 1.x不同。在ASP.NET 1.x中,默认情况下,在目录“C:Inetpubwwwrootaspnet_clientsystem_web版本号”中包含一个WebUIValidation.js文件。该文件中包括了实现客户端验证的JavaScript代码。开发人员可以通过阅读这些代码来了解验证功能的具体实现方法。ASP.NET 2.0中没有存在相关的源代码文件,而是通过WebResource.axd等机制来实现。
有关实现客户端验证的内容,主要涉及实现客户端功能等知识。这些内容在前面的文章中已经详细进行了讲解。有兴趣的读者可阅读有关文章。
3. 小结
本文主要介绍了内置验证控件,以及自定义验证控件实现机制。实际上,如果读者开发自行实现验证控件时,将会发现这个过程需要很多知识。例如,服务器端编程语言、JavaScript、CSS、DHTML等等。因此,如果读者希望创建高质量的验证控件,那么不仅要了解相关知识,而且必须达到精通的水平。
摘要
ASP.NET功能强大的一种体现就是具有丰富的Web控件,这里我们谈谈其中的一种—验证控件。它总结了各种Web数据校验方式,设计成了今天这种通用的ASP.NET控件形式。
--------------------------------------------------------------------------------
目录
1. 验证控件简介
2. 验证控件的使用方法
3. 小结
--------------------------------------------------------------------------------
1. 验证控件简介
顾名思义,验证控件就是校验用户输入数据正确性的控件,如用户在文本框中输入数据后,便显示一条提示信息,表明了校验的数据是不合法的。验证过程既可以在服务器上执行,也可以在客户机上执行,在客户端运行的校验代码是数据提交之前被执行的,因此可以提高程序的性能。ASP.NET的验证控件可以进行多种校验,如数据范围检查、数据间的比较和自定义校验等等,下面的内容将会逐一介绍这些验证控件。
--------------------------------------------------------------------------------
2. 验证控件的使用方法
① RequiredFieldValidator控件
当页面上的控件要求必须输入数据时,RequiredFieldValidator就起作用了,ControlToValidate属性选择需要验证的控件,而ErrorMessage属性则是校验不合法后显示的错误提示信息。
<HTML>
<HEAD>
<title>RequiredFieldValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
Name:
<asp:TextBox id="TextBox1" runat="server" ></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
ErrorMessage="Please enter your name" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
</form>
</BODY>
</HTML>
②CompareValidator控件
CompareValidator控件是用来比较两个输入控件之间的数据一致性的,同时也可以用来校验控件中内容的数据类型:如整形、字符串型等。ControlToCompare和ControlToValidate属性用来设置进行比较的两个控件。
<HTML>
<HEAD>
<title>CompareValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Password:
<asp:TextBox id="txtPwd" runat="server" TextMode="Password"></asp:TextBox><BR>
Confirm:
<asp:TextBox id="TxtCfm" runat="server" TextMode="Password"></asp:TextBox></P>
<P>
<asp:Button id="Button2" runat="server" Text="Button"></asp:Button>
<asp:CompareValidator id="CompareValidator1" runat="server" ErrorMessage="Password Error!"
ControlToValidate="TxtCfm" ControlToCompare="txtPwd"></asp:CompareValidator></P>
</form>
</BODY>
</HTML>
③RangeValidator控件
RangeValidator控件可以用来判断用户输入的值是否在某一特定范围内,属性MaximumValue和MinimumValue用来设定范围的最大和最小值。
<HTML>
<HEAD>
<title>RangeValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Age:
<asp:TextBox id="TxtAge" runat="server"></asp:TextBox>
<asp:RangeValidator id="RangeValidator1" runat="server" ControlToValidate="TxtAge"
ErrorMessage="Age Error!" MaximumValue="99" MinimumValue="1"></asp:RangeValidator></P>
</form>
</BODY>
</HTML>
④RegularExpressionValidator控件
RegularExpressionValidator控件可以判断用户输入的表达式是否正确,如电话号码、邮编、URL等,ControlToValidate属性选择需要验证的控件,ValidationExpression属性则编写需要验证的表达式的样式,下面的例子就是一段校验邮编的代码。
<HTML>
<HEAD>
<title>RegularExpressionValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Postal Code:
<asp:TextBox id="TxtPostalCode" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server"
ControlToValidate="TxtPostalCode" ErrorMessage="Postal Code Error!"
ValidationExpression="\d6}"></asp:RegularExpressionValidator></P>
</form>
</BODY>
</HTML>
⑤CustomValidator控件
CustomValidator控件用于执行用户自定义的验证,这种校验既可以是服务器端的也可以是客户端的,下面的代码就是使用客户端验证邮编的例子。
<HTML>
<HEAD>
<title>CustomValidator Example</title>
</HEAD>
<BODY>
<form id="Form1" runat="server">
<P>Postal Code:
<asp:TextBox id="TextBox1" runat="server"></asp:TextBox>
<asp:CustomValidator id="CustomValidator1" runat="server" ControlToValidate="TextBox1"
ErrorMessage="CustomValidator" ClientValidationFunction="ClientValidate">
</asp:CustomValidator></P>
</form>
</BODY>
</HTML>
<script language="vbscript">
Sub ClientValidate(source, arguments)
If isnumeric(arguments.Value ) and len(arguments.Value)=6 Then
arguments.IsValid=true
Else
arguments.IsValid=false
End If
End Sub
</script>
⑥ValidationSummary控件
这个控件会将页面中所有的校验错误输出为一个列表,列表的显示方式由DisplayMode属性设置。
<HTML>
<HEAD>
<title>ValidationSummary Example</title>
</HEAD>
<body>
<form id="Form1" runat="server">
<P>Age:
<asp:TextBox id="TxtAge" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator1" runat="server"
ControlToValidate="TxtAge" ErrorMessage="Age Error!" Display="None"></asp:RequiredFieldValidator><BR>
Postal Code:
<asp:TextBox id="TxtPostalCode" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator id="RequiredFieldValidator2" runat="server"
ControlToValidate="TxtPostalCode" ErrorMessage="Postal Code Error!"
Display="None"></asp:RequiredFieldValidator></P>
<P>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button></P>
<P>
<asp:ValidationSummary id="ValidationSummary1" runat="server"
HeaderText="You must enter a value in the following fields:"></asp:ValidationSummary></P>
</form>
</body>
</HTML>