第三章 用检验控件执行表单的验证

 

第三章 用检验控件执行表单的检验

主要内容:

使用客户端检验

必填域控件:RequiredFieldValidator

检验表达式控件:RegularExpressionValidator

比较值控件:CompareValidator

检查值范围控件:RangeValidator

错误汇总控件:ValidatorSummary

自定义检验控件:CustomValidator

禁用检验

 

一、   使用客户端检验

传统上,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代码就会自动发送到你的浏览器。

 

禁用客户端表单检验,只需在页面顶端添加指令:

<%@ Page ClientTarget=downlevel %>

这个指令,不但禁用客户端的表单检验,还会阻止页面上所有ASP.NET控件显示任何非HTML 3.2 兼容的内容(比如页面上表现级联样式表的属性)

注意:ClientTarget属性对应于machine.config文件的<clientTarget>条目,它接受一个字符串值。其中uplevel被定义为IE4.0;downlevel被定义为Unknow browser(即假设不支持级联样式表)

 

禁用各检验控件的客户端检验,可以通过将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="输入密码需要320个字符" 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(比较内容可以是固定值或控件的输入值)

属性

属性

说明

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

最大值和最小值可以是:日期、数值、货币或字符串。

属性

属性

说明

ControlToValidator

 

Display

 

EnableClientScript

 

Enabled

 

ErrorMessage

 

IsValid

 

MaximumValue

 

MinimumValue

 

Text

 

Type

 

 

注意:如果需要检查,输入值是否位于【其他表单域中的值】所决定的范围,应该使用CompareValidator。(CompareValidator控件允许比较不同控件的值)

 

六、   错误汇总控件ValidatorSummary

使用这个控件,可以在【希望的任何地方】总结所有错误。

重要属性

属性

说明

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="密码位数在26之间" 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

重要属性

ClientValidationFunction

客户端检验函数的名称

ControlToValidate

 

Display

 

EnableClientScript

 

Enabled

 

ErrorMessage

 

IsValid

 

Text

 

事件

ServerValidate       用于执行服务器端检验的函数

 

使用CustomValidator控件,通过编写子例程,可以在服务器端执行,也可以在客户端检验。

 

若要在服务器端检验,需要编写OnServerValidate(s As object,e as ServerValidateEventArgs)事件。

其中的第二个参数类型为ServerValidatorEventArgs,它具有两个参数:

IsValid——为True时,表示成功通过检查

Value——要检验控件的值。

警告:可以用于检查【空表单域】的惟一控件是RequiredFieldValidator,因为当被检验控件没有数据时,自定义的检验子例程不会被调用。

八、   禁用检验

在包含检验控件的表单上实现Cancel按钮的功能比较困难。

问题在于,客户端检验脚步会阻止与Cancel按钮相关联的任何子例程的执行。

解决此问题,需要使用Button、LinkButton和ImageButton控件的特殊属性【CausesValidation】。(可以在按钮点击时启用或禁用检验,需要将其设置为False)

posted @ 2009-03-24 12:30  怒杀神  阅读(424)  评论(0编辑  收藏  举报