当前位置: 首页 > news >正文

[jQuery]使用jQuery.Validate进行客户端验证(中级篇-上)——不使用微软验证控件的理由...

在上一篇使用 jQuery.Validate进行客户端验证(初级篇)中我介绍了为什么选用jQuery.Validate作为客户端的理由,同时也介绍了jQuery.Validate的基本用法以及中文验证消息的修改方法,今天的中级篇我将介绍下jQuery.Validate的一些常见的验证的使用方法。

jQuery.Validate为我们提供了3种验证编写方式,各有优缺点:

1、在input对象中书写class样式指定验证规则或属性验证规则:

如<input type=”text” class=”required”/>

最简单、最便捷,提示消息使用jQuery.Validate的内置的消息(自定义扩展验证规则也属于此项),但是由于是以样式名的方式进行验证,导致了日后修改必须找到相应的input对象,同时无法使用高级验证规则,具体说明请向下看

2、同第1条,这种验证规则方式也是在input对象中书写class样式,只不过书写的方式改为了JSON格式,但是这种方式提供了自定义验证消息的支持:

如<input type=”text” class="{required:true,minlength:5,,messages:{required:'请输入内容'}”/>

简单、方便,但个人认为有点臃肿,还是和第1条一样和相对应的input对象纠缠在一起,并且还增加消息自定义,使得input对象变的更大了,干扰了页面代码的阅读,但可以使用高级验证规则(实际就是将第3种JS以JSON的格式放到具体的class中

3、这种方式使用纯JS的方式:

如:

$().ready(function() {
    $("#aspnetform").validate({
         rules: {
         name: "required",
         email: {
                 required: true,
                 email: true
         }

     })

})

很好的解决了HTML和验证规则的分离,就是书写较为麻烦,需要单独写JS脚本,但好处是可以统一验证规范,将每个页面的验证规则都写在头部的脚本中,方便日后维护。

注意:以上3种验证方式的消息如果未指定都会默认调用内置的消息

在了解了jQuery.Validate为我们提供几种验证方式后,我们来具体分析下每个验证方式:

第一种,在input对象中书写class样式指定验证规则或属性验证规则,可以将该input需要的规则一次性写在里面(具体见页面Middle-1.aspx)。

如:

<asp:TextBox ID="txtAge" runat="server" class="required number" max="99" min="1"></asp:TextBox>

这段代码的意思是必须输入年龄字段,年龄必须是数字,同时必须在0-99范围内,使用起来很方便写几个属性就可以搞定,可以根据需求自由的组合验证规则。

但是就如上面说的许多高级的验证规则无法使用:

range(范围验证,这个就可以替代max,min),

rangeLength(长度范围验证,可以替代maxLength,minLength),

equalTo(比较验证,这个其实可以用,但是如果使用使用的是ASP.NET控件就不行,纯HTML控件可以。

看下代码,我想比较2次输入的密码是否一样时理论上可以这么写:

<asp:TextBox ID="txtRePwd" runat="server" TextMode="Password" CssClass="required" minlength="6" equalTo='#<%=txtPwd.ClientID %>'></asp:TextBox>

但是由于ASP.NET控件的机制问题,会把#<%=txtPwd.ClientID %>进行转译成#&lt;%=txtPwd.ClientID %>这样就导致了要比较的ID无法正确获取,导致验证不成功。

但如果这么写就不会出现问题:

<input type=”password” class=”required” minlenght=”6” equalTo=”txtPwd”/>

 

第二种,同样书写class验证规则,只不过以JSON格式书写,可自定义验证消息,高级验证功能,JS验证规则的简化版(具体见页面Middle-2.aspx):

这种方式由于要以JSON的格式来编写规则,所以需要引用个单独的JS文件:jquery.metadata.js

具体书写代码格式如下:

<asp:TextBox ID="txtUid" runat="server" CssClass="{required:true,messages:{required:'不输入用户名你怎么登陆?'}}"></asp:TextBox>

<asp:TextBox ID="txtPwd" TextMode="Password" runat="server" CssClass="{required:true,minlength:6,messages:{required:'你不输入密码怎么行呢?',minlength:'密码太短啦至少6位'}}"></asp:TextBox>

具体意思分别是:必须输入用户名和必须输入密码同时长度至少6位。

注意:这边我重新定义了验证信息,这样就不用使用原先在jQuery.Validate中的内置的通用消息,可以指定更加人性化的消息,看下截图(可以对比下内置提示信息和自定义提示信息):

 pic20

使用了这种方式后,我们就可以使用第一种验证方式中无法使用的一些验证规则了,如range:

<asp:TextBox ID="txtAge" runat="server" class="{required:true,number:true,range:[1,99],messages:{range:'您的年龄有问题把,得在1-99岁之间哦'}}"></asp:TextBox>

同样我这边也修改了具体具体的消息,而rangelength的用法也与这个类似我就不演示了。

同样很遗憾的,由于ASP.NET控件特性问题equalTo在这也不能使用,HTML还是有效的。

 

 

第三种,使用JS进行规则验证,可以使用所有验证规则,并且可以试HTML代码和验证规则很好的分离,方便日后维护(具体代码见Middle-3.aspx)

这种方式需要手写JS来编写验证的规则,具体的格式如下:

view source print ?
01function InitRules() {
02    opts = {
03         rules:
04         {
05                <%=txtUid.UniqueID %>: 
06                {
07                    required: true
08                },
09                <%=txtPwd.UniqueID %>: 
10                {
11                    required: true,
12                    minlength: 6
13                },
14                <%=txtRePwd.UniqueID %>: 
15                {
16                    required: true,
17                    minlength: 6,
18                    equalTo:"#<%=txtPwd.ClientID %>"
19                },
20                <%=txtName.UniqueID %>: 
21                {
22                    required: true
23                },
24                <%=txtAge.UniqueID %>: 
25                {
26                    required: true,
27                    number: true,
28                    range: [1,99]
29                },
30                <%=txtEmail.UniqueID %>: 
31                {
32                    email: true
33                }
34         },
35         messages:
36         {
37                <%=txtPwd.UniqueID %>:
38                {
39                    required:"不输入用户名你怎么登陆?"
40                },
41                <%=txtPwd.UniqueID %>: 
42                {
43                    required:"你不输入密码怎么行呢?",
44                    minlength:"密码太短啦至少6位"
45                },
46                <%=txtAge.UniqueID %>: 
47                {
48                    range:"您的年龄有问题把,得在1-99岁之间哦"
49                }
50         }
51    }
52}

这种方式虽然可以使用所有的高级功能,验证规则也分离出来了,但是就是书写起来不简便,所以我的个人建议是如果不是要求很高的情况下,可以将如required,number,email等常规的简单的验证规则使用第1种验证方式,方便、快捷,只有当第1种无法实行的时候才使用这种方式,如equalTo(比较验证),remote(AJAX验证)等,这样相互结合效率是最高的

到这边可能会有人奇怪了,因为在上面介绍这种JS验证方式的的时候有个小例子,需要把规则放入jQuery.Validate的方法中,否则制定的验证规则是无效的。

这里我就要说明下了,因为,这个例子中我使用的模拟一个项目的形式编写的,页面全部套用母版页,所以为了满足jQuery.Validate拦截form表单的方式,所以我在母版页中的<header>定义了一个变量用来存放每个页面中定义的验证规则:var opts = null;,这样根据HTML从上到下的解析方式首先opts被定义,然后在每个子页面被赋值,最后再返回母版页中的jQuery.Validate初始拦截form方法:

jQuery(document).ready(function() {
    if (opts != undefined || opts != null) {
        jQuery("#<%=form1.ClientID %>").validate(opts);
    } else {
        jQuery("#<%=form1.ClientID %>").validate();
    }
});

如果在子页面里制定了规则,则按规则验证,没有规则则直接验证(这边的opts中包含的规则和具体的class规则不会有冲突,你可以将一部分规则写在opts中(remote,equalTo),另外的规则写在class中(required,number等)

 

以上就是使用jQuery.Validate进行客户端验证中级篇-上,具体的代码请下载源代码进行查看。

PS:1、本来想把中篇写成一篇的,但是写着写着发现东西实在太多,写在1篇里会太多,所以分成了2篇写,请见谅!

2、下一篇将对jQuery.Validate的使用过程中会碰到的问题进行介绍,如第2种验证方式更改验证规则所处的属性、指定验证信息显示位置等。

源代码下载:点我下载

相关文章:

  • 如何使用Exchange邮件组仲裁
  • iphone iPhone开发中为UINavigationBar设置背景图片方法
  • aix url
  • 善于记录,善于总结——《走出软件作坊》读后感
  • 虚拟机vMotion失败:A general system error occurred:Failed to flush checkpoint
  • 最常见Linux守护进程简介
  • haproxy负载均衡
  • 【转】ASP.NET服务器对于请求的处理过程
  • Cnblogs metaweblog api link
  • 2012新年第一天,澳门游后记
  • bcb6 中的 shdocvw.hpp
  • Wt::JSlot Class Reference
  • 面试中经常遇到的SQL
  • linux小知识
  • 部署 Lync 2010 移动电话(Internal)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • CentOS 7 防火墙操作
  • conda常用的命令
  • gops —— Go 程序诊断分析工具
  • go语言学习初探(一)
  • JAVA SE 6 GC调优笔记
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • PHP的Ev教程三(Periodic watcher)
  • PHP那些事儿
  • Redis 懒删除(lazy free)简史
  • windows下mongoDB的环境配置
  • windows下使用nginx调试简介
  • 阿里云前端周刊 - 第 26 期
  • 对象引论
  • 高度不固定时垂直居中
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 跳前端坑前,先看看这个!!
  • 学习HTTP相关知识笔记
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • C# - 为值类型重定义相等性
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #include<初见C语言之指针(5)>
  • (12)目标检测_SSD基于pytorch搭建代码
  • (二十三)Flask之高频面试点
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)重识new
  • .dwp和.webpart的区别
  • .NET BackgroundWorker
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑