验证控件-初探

 

系统提交中,验证客户端输入是很有必要的,ASP.NET 中具有客户端输入验证的控件,使得我们大多数验证都变得很简单,不再需要编程即可完成,我们所要做的,就是对验证控件属性作一些设置。ASP.NET 中有五个验证控件:RequiredFieldValidator、CompareValidator、RangeValidator、RegularExpressionValidator、CustomValidator,另外还有一个 ValidationSummary,该控件不用于验证,但它会把未通过验证的栏目都列举出来。我们将在连载中一一介绍这些控件。

验证控件中有几个公用的属性较为有用,它们是:

  • ControlToValidate 要验证哪一个控件。
  • Display 如何显示验证控件,有三个可选值:dynamic-平常不占用页面空间,验证未通过时占用页面空间,并显示文字;None-一直不占用页面空间;Static(默认值)-一直占用页面空间,验证未通过时显示文字。
  • SetFocusOnError 是否在验证未通过时将焦点移动到被验证控件上,默认 false。
  • ErrorMessage 这是验证未通过时显示的错误信息,但我们一般还将错误信息写在验证控件的开始标签和结束标签之间,有什么区别呢?
    • ErrorMessage 可以被程序调用,写在开始标签和结束标签的文字不能被程序调用;
    • 当开始标签和结束标签之间没有文字时,验证未通过时显示 ErrorMessage 的属性值;
    • 如果二者同时存在,则显示错误信息时,显示的是开始标签和结束标签之间的文字。
  • Text,Text 与 ErrorMessage 类似,根据前面一点的分析,优先级为:标签之间的文字 > Text > ErrorMessage。



Read more: http://www.cftea.com/c/2007/11/17JFPZ47155LMES0.asp#ixzz0ESHFfPbL&B

本节介绍 RequiredFieldValidator,该控件用于验证某一控件是否输入有内容,较为简单。

    <asp:TextBox ID="tb" runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="valid1" runat="server"
        ControlToValidate="tb" Display="dynamic" SetFocusOnError="true">*</asp:RequiredFieldValidator>
    <asp:Button ID="btn" runat="server" Text="提交" />

如果验证未通过,则显示“*”。



Read more: http://www.cftea.com/c/2007/11/X34WROKCAIW171VP.asp#ixzz0ESHJgOlp&B

本节介绍 CompareValidator,该控件用于比较输入值,功能强大。

    <asp:TextBox ID="p1" runat="server" TextMode="password"></asp:TextBox>
    <asp:TextBox ID="p2" runat="server" TextMode="password"></asp:TextBox>
    <asp:RequiredFieldValidator ID="valid2" runat="server"
        ControlToValidate="p2">*</asp:RequiredFieldValidator>
    <asp:CompareValidator ID="valid1" runat="server"
        ControlToValidate="p2" ControlToCompare="p1"
        Type="String" Operator="equal"
        Display="dynamic" SetFocusOnError="true">两次密码不一致</asp:CompareValidator>
    <asp:Button ID="btn" runat="server" Text="提交" />
  • ControlToCompare 要与哪一个控件的值进行比较。
  • Type 输入值的类型,可选值有:Currency、Date、Double、Integer、String。
  • Operator 执行什么样的比较操作,可选值有:DataTypeCheck、Equal、GreaterThan、GreaterThanEqual、LessThan、LessThanEqual、NotEqual。
  • Operator 的 DataTypeCheck 用于检查输入是否是日期类型(不含时间),此时不需要指定 ControlToCompare,并且 Type 必须是 Date。
  • 也可以不是两个控件输入值之间的比较,而是一个控件输入值与一个值的比较,此时用 ValueToCompare 代替 ControlToCompare。

注意:如果 ControlToValidate 对应的输入值是零长度字符串,则不论 ControlToCompare 对应的输入值是多少,也不论 ValueToCompare 对应的值是多少,比较验证总是通过,所以这里也要加上 RequiredFieldValidator



Read more: http://www.cftea.com/c/2007/11/JU8I3ZRE35STMJYN.asp#ixzz0ESHNcbZF&B

本节介绍 RangeValidator,该控件用于判断输入值的范围。

    <asp:TextBox ID="tb" runat="server"></asp:TextBox>
    <asp:RangeValidator ID="valid1" runat="server"
        ControlToValidate="tb" Type="Integer" MinimumValue="0" MaximumValue="255"
        Display="dynamic" SetFocusOnError="true">请输入 0-255 之间的整数</asp:RangeValidator>
  • Type 输入值的类型,可选值有:Currency、Date、Double、Integer、String。
  • MinimumValue 允许的最小值。
  • MaximumValue 允许的最大值。

注意:同 CompareValidator 一样,如果被验证的控件没有输入值,则总是会验证通过,所以大多数情况下,我们还需要将 RangeValidator 和 RequiredFieldValidator 联合起来应用。

Type 为 String(ValidationDataType.String)时,MinimumValue 和 MaximumValue 并不代表字符串长度范围,实际上 ASP.NET 并没有启用对该类型的 RangeValidator 的显式支持,建议这种情况下使用 RegularExpressionValidator。注意:MinimumValue 和 MaximumValue 是字符串类型。



Read more: http://www.cftea.com/c/2007/11/90NHHVQGZDL4HK1T.asp#ixzz0ESHXh6eA&B

本节介绍 RegularExpressionValidator,该控件判断输入值是否符合某一个正则表达式。

    <asp:TextBox ID="tb" runat="server" Text="3333"></asp:TextBox>
    <asp:RegularExpressionValidator ID="valid1" runat="server"
        ControlToValidate="tb" ValidationExpression="[a-zA-Z0-9_]{6,12}"
        Display="dynamic" SetFocusOnError="true">必须是 6-12 位的字母或数字或下划线</asp:RegularExpressionValidator>
    <asp:Button ID="btn" runat="server" Text="提交" />
  • ValidationExpression 要验证的正则表达式。

注意:输入值为零长度字符串时,同样不会进行验证,所以一般也是要和 RequiredFieldValidator 联合运用。



Read more: http://www.cftea.com/c/2007/11/NP4H33TXFBSIG7FV.asp#ixzz0ESHbvR4o&B

本节介绍 CustomValidator,该控件用于自定义验证,我们以验证是否选择了下拉列表框(DropDownList)的有效项为例。

    <asp:DropDownList ID="list" runat="server">
      <asp:ListItem Text="请选择" Value="0"></asp:ListItem>
      <asp:ListItem Text="Item1" Value="a"></asp:ListItem>
      <asp:ListItem Text="Item2" Value="b"></asp:ListItem>
    </asp:DropDownList>
    <asp:CustomValidator ID="valid1" runat="server"
        ControlToValidate="list" OnServerValidate="ChkList"
        Display="dynamic" SetFocusOnError="true" ErrorMessage="d">请选择项目</asp:CustomValidator>
    <asp:Button ID="btn" runat="server" Text="提交" />

下拉列表框中的第一项为提示项,如果在下拉列表框中没有选择 Item1 或 Item2,则提示“请选择项目”,注意:下拉列表框的提示项的 value 不能是零长度字符串,否则不会进行验证!下面接着看验证函数代码:

    protected void ChkList(object source, ServerValidateEventArgs args)
    {
        if (args.Value != "0")
        {
            args.IsValid = true;
        }
        else
        {
            args.IsValid = false;
        }
    }

args 有两个重要属性:

  • Value 要验证的值。
  • IsValid 验证是否通过。



Read more: http://www.cftea.com/c/2007/11/BI6ST1SSTI6B6NBE.asp#ixzz0ESHfdHkF&B
本节介绍 ValidationSummary,该控件并不验证输入值,而是集中显示验证结果。

    <div>
        用户名:<asp:TextBox ID="userName" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="userNameValid" runat="server"
            ControlToValidate="userName" ErrorMessage="必须输入用户名">*</asp:RequiredFieldValidator>
    </div>
   
    <div>
        密 码:<asp:TextBox ID="passwd" runat="server" TextMode="password"></asp:TextBox>
        <asp:RequiredFieldValidator ID="passwdValid" runat="server"
            ControlToValidate="passwd" ErrorMessage="必须输入密码">*</asp:RequiredFieldValidator>
    </div>
   
    <div>
        确认密码:<asp:TextBox ID="rePasswd" runat="server" TextMode="password"></asp:TextBox>
        <asp:RequiredFieldValidator ID="rePasswdValid" runat="server"
            ControlToValidate="rePasswd" ErrorMessage="必须输入确认密码">*</asp:RequiredFieldValidator>
        <asp:CompareValidator ID="rePasswdValid2" runat="server"
            ControlToValidate="rePasswd" ControlToCompare="passwd"
            Type="String" Operator="equal" ErrorMessage="两次密码必须一致">两次密码必须一致</asp:CompareValidator>
    </div>
   
    <div>
        <asp:ValidationSummary ID="regValidationSummary" runat="server"
            HeaderText="输入错误" DisplayMode="BulletList" />
    </div>
   
    <div>
        <asp:Button ID="btn" runat="server" Text="注册" />
    </div>
  • HeaderText 标题文字。
  • DisplayMode 如何显示错误信息,有三个可选值:BulletList(默认值) 利用 ul 显示列表;List 一行一条错误信息;SingleParagraph 单行显示。
  • 错误信息来源于验证控件的 ErrorMessage。



Read more: http://www.cftea.com/c/2007/11/7P5BXRCRRYV7NS7Y.asp#ixzz0ESHjioy9&B

前面提到零长度字符串的输入值不会被验证,而当作验证通过处理,那么除了零长度字符串,还有哪些输入值不会被验证呢?

查看服务器生成的 JS 代码,可以发现在验证之前都要进行如下处理:

function ValidatorTrim(s) {
    var m = s.match(/^/s*(/S+(/s+/S+)*)/s*$/);
    return (m == null) ? "" : m[1];
}

这段代码在互联网上的解释就是除去字符串两端的空格,这种说法大致是正确的,但更准确的说法是:除去字符串两端的换页符、换行符、回车符、制表符(Tab 制表符)、垂直制表符、英文空格。

再查看验证过程,可以发现:

    if (ValidatorTrim(value).length == 0)
        return true;

也就是说按 ValidatorTrim 处理后,如果字符串为零长度,就会直接返回验证通过。但是,这里长度判断通过后,进一步验证(比如正则表达式验证)使用的字符串是输入的原样字符串,不是“掐头去尾”的。


说到这里顺便解释一下上面的正则表达式。

match 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。

正则表达式 /^/s*(/S+(/s+/S+)*)/s*$/ 中:

  • / 是 JS 中正则表达式限定符。
  • ^ 是字符串开始。
  • $ 是字符串结尾。
  • /s 是空格符、制表符、换行符等。
  • /S 是非空格符、制表符、换行符等。
  • * 是匹配前一个字符零次及以上。
  • + 是匹配前一个字符一次及以上。
  • () 是一个子表达式。

由于没有指定全局查找 g,并且 () 的优先级很高(仅位于转义符之后),所以返回的数组的第一元素是整个字符串,第二个元素是匹配 (/S+(/s+/S+)*) 的部分,也就是上面说的效果。



Read more: http://www.cftea.com/c/2007/11/04FXPHZL54CPBENV.asp#ixzz0ESHoko22&B

之前讲的几个验证控件,除了 CustomValidator 都可以在客户端进行验证,那么服务器端会不会再次验证呢?如果服务器端不再次验证那客户端不是可以绕过验证了。非常高兴的是,默认情况下,客户端和服务器端都会验证。我们这一节就是要了解几个与验证相关的属性和方法,这对我们开发高级程序大有好处。

  • Validate() 验证控件和 Page 均具有此方法,表示在服务器端调用验证,Page 的 Validate() 方法中还可以多带一个参数,在后面讲到。
  • IsValid 验证控件和 Page 均具有此属性,表示验证是否通过。
  • CausesValidation 这个是 TextBox、Button 等控件的属性,不是验证控件的属性,表示是否自动进行验证。可选值为:true、false。TextBox 等输入类控件的默认值为 false;Button 等按钮的默认值是 true。
    • TextBox 的 CausesValidation 默认值为 false,也就是说由 TextBox 触发回发时,该网页的验证控件在客户端和服务器端都不会自动工作,得人工调用 Validate() 来进行验证;
    • 那么 TextBox 会不会触发回发呢?默认不会,因为其 AutoPostBack 属性值默认为 false。如果我们将 TextBox 的 AutoPostBack 设为 true,则 TextBox 的值有变化时,会触发回发。
    • Button 的 CausesValidation 默认值为 true,也就是说单击 Button 时,该网页的验证控件在客户端和服务器端都会自动工作,程序员没有必要再调用 Validate()。
  • ValidationGroup 验证组。举例说明:“用户资料”分为“登录资料”和“真实资料”,如果没有 ValidationGroup,则“登录资料”和“真实资料”是一起验证的。现在我想先验证“登录资料”,验证通过后再验证“真实资料”(实际中 ValidationGroup 常用于根据条件进行选择性的验证),则需要把验证“登录资料”的验证控件的 ValidationGroup 属性值设置为同一个值,而把验证“真实资料”的验证控件的 ValidationGroup 属性值设置为另一个值。
    • 指定了 ValidationGroup 的验证控件不会自动工作;
    • 也就是说指定了 ValidationGroup 的验证控件不会在客户端工作,在服务器端也不会自动工作。
    • 要让指定了 ValidationGroup 的验证控件在服务器端工作,就必须调用该控件的 Validate() 方法,或者调用 Page.Validate() 方法,或者调用 Page.Validate(string validationGroup) 方法。Page.Validate() 相当于调用页面中所有的验证控件的 Validate(),而 Page.Validate(string validationGroup) 相当于调用页面中 ValidationGroup 属性值为 validationGroup 的验证控件的 Validate()。
  • 再回头说一说 IsValid,验证控件的 IsValid 默认值是 true,但 Page.IsValid 不能随便使用,要使用 Page.IsValid 必须是验证控件自动工作了之后,或者手动调用了 Page.Validate() 之后,或者手动调用了 Page.Validate(string validationGroup) 之后。



Read more: http://www.cftea.com/c/2007/11/M0HJMJIQIT2AB48U.asp#ixzz0ESHsrbDp&B

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值