2019独角兽企业重金招聘Python工程师标准>>>

引用源:http://www.cnblogs.com/kyo-yo/archive/2010/07/06/Use-jQuery-Validate-To-Being-Client-Validate-High-2.html


    
return  uid == "testuid"  ? true  : false ;
}

相当的简单,就是判断下用户名是不是指定的用户名。

注意:webservice.cs中必须将[System.Web.Script.Services.ScriptService]这个特性取消注释,否则AJAX验证将无效!

第二点:默认jQuery.Validate在进行AJAX验证时返回必须是bool类型,如何返回一个对象包括错误消息及验证结果?(具体见App_Code/WebService.cs/CheckUid)

在第一点中介绍jQuery.Validate知识的时候就提到了,jQuery.Validate默认直接收true或false,但是在具体的开发中,我们会分层开发,三层或者多层,webservice在接收到验证请求后不做具体的处理直接调用逻辑层的验证方法,交由逻辑层进行验证操作(当然你也可以把验证全部写在webservice中,但是这样就体现不出分层的好处了),此时的验证会产生多种情况,以最常见的用户名验证为例:

1)用户名已存在,此时的消息应该是“用户名已存在,请重新输入!”

2)用户名不符合规则,此时的消息应该是“用户名不符合规则,请重新输入!”

3)验证时出现程序异常,此时的消息应该是“程序出现异常,请联系管理员!”

可以看出,仅仅一个用户名验证就会出现这3种信息,如果不返回一个明确的消息,仅仅告诉用户“用户名有误”,客户端的使用者将会相当的痛苦,因为使用者并不知道他的用户名输入到底错在哪了。

所以为了更好的客户体验,以及项目的合理性,我们在服务器端封装一个实体类(具体见AppCode/AjaxClass),代码如下:

?
1
2
3
4
5
6
[Serializable]
public  class  AjaxClass
{
     public  string  Msg { get ; set ; }
     public  int  Result { get ; set ; }
}

就是一个最简单的实体类,有2个属性,Msg和Result,Msg用于存放验证失败的信息,Result用于存放结果。

看下WebSerivce的代码如何修改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[WebMethod]
public  AjaxClass CheckUid( string  uid)
{
     //return uid == "testuid" ? true : false;
     AjaxClass ajaxClass = new  AjaxClass();
     try
     {
         if  (uid == "testuid" )
         {
             ajaxClass.Msg = "用户名已存在,请重新输入!" ;
             ajaxClass.Result = 0;
         }
         else  if  (uid.IndexOf( "test" ) == -1)
         {
             ajaxClass.Msg = "用户名格式不正确,用户名必须包含test,请重新输入!" ;
             ajaxClass.Result = 0;
         }
         else
         {
             ajaxClass.Msg = "格式正确!" ;
             ajaxClass.Result = 1;
         }
     }
     catch
     {
         ajaxClass.Msg = "程序出现异常,请联系管理员!" ;
         ajaxClass.Result = 0;
     }
     return  ajaxClass;
}

上面的WebService就完整的实现了我先前说的3种错误情况(由于这边仅仅是例子所以就只有表示层,实际开发中需要分层开发,此代码应该放入业务逻辑层)

注意:在webservice返回值前,如果检查成功必须要为ajaxClass.Result = 1,否则客户端验证会无法通过。

虽然完成了服务器端的代码修改,但是直接运行页面还是会出错,这是因为我上面所说过的,jQuery.Validate的remote远程的输出只能是true或者false,我们来看下具体的代码,其中注释掉的就是原来官方的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
success: function(response) {
     if (response.Result) {//if(response){
         var submitted = validator.formSubmitted;
         validator.prepareElement(element);
         validator.formSubmitted = submitted;
         validator.successList.push(element);
         validator.showErrors();
     } else {
         var errors = {};
         //errors[element.name] = response.Result || validator.defaultMessage(element, "remote");
         errors[element.name] = response.Msg;
         validator.showErrors(errors);
     }
     previous.message = response.Msg; //previous.valid = response;
     previous.valid = response.Result;
     validator.stopRequest(element, response.Result);
}

可以看到一共修改了3处地方:

1、判断返回值,原来是直接判断response,现在则是判断response.Result,因为现在的response已经是一个包含消息及结果的对象了。

2、错误消息,原来的错误消息是直接获取默认配置好的消息,我这边是获取response.Msg。

3、设置previous对象,将previous对象的消息和结果设置为AJAX返回的消息和结果,以供jQuery.Validate下面代码的返回。

这样jQuery.Validate的remote的方法就修改了,但是并没有结束,原因是先前在AJAX提交参数的时候由于jQuery.Validate的验证规则的缘故,提交的参数并不是以JSON的格式提交的而是以{uid:function()}这样的方式,结果就导致了无法设置jQuery.AJAX的contentType:"application/json; charset=utf-8",如果设置了会出现以下错误:

这样从webservice返回的AjaxClass对象就无法像以往的JSON方式直接操作了,所以我们只能换一种格式——XML,因为webservice默认返回的数据是XML格式:

?
1
2
3
4
5
<? xml  version = "1.0"  encoding = "utf-8"  ?>
- < AjaxClass  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd = "http://www.w3.org/2001/XMLSchema"  xmlns = "http://tempuri.org/" >
   < Msg >用户名格式不正确,用户名必须包含test,请重新输入!</ Msg >
   < Result >0</ Result >
   </ AjaxClass >

接下来看下具体的remote方法应该如何编写,设置dataType:”xml”,然后将XML数据转换成一个对象以供上面我修改的jQuery.Validate的remote方法中ajaxsuccess的使用,具体看一下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
remote:{
     type: "POST",
     dataType:"json",
     async: false,
     url: "WebService.asmx/CheckUid",
     data: {uid:function(){ return jQuery("#<%=txtUid.ClientID %>").val();}},
     dataFilter: function(dataXML) {
         var result = new Object();
         result.Result = jQuery(dataXML).find("Result").text();
         result.Msg = jQuery(dataXML).find("Msg").text();
         if (result.Result == "-1") {
             result.Result = false;
             return result;
         }
         else {
             result.Result = result.Result == "1" ? true : false;
             return result;
         }
     }
}

就是jQuery.Ajax方法dataFilter,可以在AJAX请求成功后将数据进行过滤处理,这里我就使用了jQuery方法把结果和消息从XML中获取出来直接赋给一个对象,再将这个对象返回,交由ajaxsuccess使用。

这样就算是完成了修改jQuery.Validate的remote方法,使得可以返回验证结果及验证消息,看下效果图:

第三点:在反复使用jQuery.Validate进行AJAX验证时,总是需要编写相关AJAX参数,可否进行进一步封装?(具体见High-3.aspx和jquery.validate.extension.js)

在开发一个系统的时候经常会用到AJAX的验证,而如果每次都要编写上面那么多的代码还是很不方便,所以我现在就来进行一下简单的封装,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//远程验证抽象方法
function GetRemoteInfo(postUrl, data) {
     var remote = {
         type: "POST",
         async: false,
         url: postUrl,
         dataType: "xml",
         data: data,
         dataFilter: function(dataXML) {
             var result = new Object();
             result.Result = jQuery(dataXML).find("Result").text();
             result.Msg = jQuery(dataXML).find("Msg").text();
             if (result.Result == "-1") {
                 result.Result = false;
                 return result;
             }
             else {
                 result.Result = result.Result == "1" ? true : false;
                 return result;
             }
         }
     };
     return remote;
}

这个函数主要接收2个参数,一个是远程验证的路径和需要提交的参数,返回包装好的remote对象。

页面调用也很简单,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script src="scripts/jquery.validate.extension.js" type="text/javascript"></script>
     <script type="text/javascript">
         function InitRules() {
             var dataInfo = {uid:function(){ return jQuery("#<%=txtUid.ClientID %>").val();}};
             var remoteInfo = GetRemoteInfo('WebService.asmx/CheckUid', dataInfo);
             opts = {
              rules:
                 {
                     <%=txtUid.UniqueID %>:
                     {
                         required: true,
                         remote:remoteInfo
                     }
                 }
             }
         }
     </script>

怎么样?相比上面的代码一下子干净了很多吧?

页面上只要做3步操作:

1、包装好需要提交的data对象。

2、将远程验证地址和包装好的data对象传递给封装好的方法获取remote对象。

3、将函数返回的remote对象放入规则中。

至此使用jQuery.Validate进行客户端验证——不使用微软验证控件的理由这一系列就算全部写完了,大体上将jQuery.Validate在ASP.NET上的一些常见应用讲了一下,同时也提出了许多我自己修改扩展的东西,希望对正在苦恼客户端验证的朋友有所帮助,谢谢大家的支持了!

PS:1、其实这一系列并没有把jQuery.Validate的所有功能介绍完,比如onfocusin,onfocusout,onkeyup等,这些就需要大家在使用的过程中自己查看源代码实验了。

2、本文有点长,而且内容比较多,如果文中有什么错误或者有指导意见欢迎大家提出来,谢谢了!

源代码下载:点我下载

转载于:https://my.oschina.net/u/3647620/blog/1552387

[jQuery]使用jQuery.Validate进行客户端验证(高级篇-下)——不使用微软验证控件的理由...相关推荐

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

    在上一篇使用jQuery.Validate进行客户端验证(中级篇-下)中我介绍了jQuery.Validate在日常使用的过程中会遇到哪些问题及解决办法,今天的高级篇则主要是对jQuery.Valid ...

  2. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇下)...

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. A awesome android expert interview questions a ...

  3. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK...

    LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...

  4. Android ActionBar高级自定义——设置标题居中和添加控件

    转载地址:http://blog.csdn.net/gtbluesky/article/details/44656567 关于ActionBar的一些常见使用方法我已经在之前两篇博文(Android ...

  5. Jquery中对常用控件赋值的方法

    场景 通过Jquery进行ajax请求数据后将返回的数据给页面中的 控件进行赋值. 实现 1.对input进行赋值$("#id").val("赋值");2.对l ...

  6. Wijmo 更优美的jQuery UI部件集:在安全站点使用Wijmo控件

    通常我们总会遇到这样的问题,在安全站点(HTTPS)中使用C1Wijmo控件时,用户可能会收到脚本错误. 发生这种状况的是由于我们的CDN链接不是https链接. 解决HTTPS 的错误 为了解决上述 ...

  7. Silverlight4控件纯客户端注册验证

    本文实现了一个实验性的Silverlight控件纯客户端注册验证机制.希望做过这方面的朋友多给些指导性意见. 先给大家介绍一下Silverlight客户端控件的使用情景.一般来说,Silverligh ...

  8. 9 款样式华丽的 jQuery 日期选择和日历控件

    现在的网页应用越来越丰富,我们在网页中填写日期和时间已经再也不用手动输入了,而是使用各种各样的日期时间选择控件,大部分样式华丽的日期选择和日历控件都是基于jQuery和HTML5的,比如今天要分享的这 ...

  9. Asp.Net就业课之三验证控件

    验证控件 作用:验证信息是否正确.有效.合理. 一.数据有效性验证方式 1.后台C#代码验证: ​ 信息页面回传,回传到服务器,用户体验不好,服务器压力大.有很多个客户端网页的时候,1000万级别,会 ...

最新文章

  1. 一图读懂58大数据平台架构演进
  2. 自动驾驶又陷“派系”之争:该约束行人还是让车更完美
  3. 妈呀,终于搞定VIM的复制粘贴问题了!
  4. Xah Lee Web 李杀网
  5. pthread 立即停止线程_pthread线程的终止退出 | 线程的大量创建
  6. ASP.NET Core Blazor Webassembly 之 组件
  7. java将字体输出成图片格式_JAVA IO流中,能否将一个字符串以图片的格式输出出来呢,即字符串显示在图片上...
  8. Asp.net MVC使用Filter解除Session, Cookie等依赖
  9. Red Hat Enterprise Linux 7.9 下载
  10. 金融第三方网银在线支付通道、支付宝网银在线支付通道对接
  11. 文件查找工具Everything的使用技巧
  12. error occurred during initialization of VM报错解决
  13. VendorNPC.lua --随身商人
  14. 服务器被打了之后怎么办?
  15. 去香港读研——申请全过程
  16. loadrunner监控mysql服务性能
  17. day3--高级数据类型
  18. NG-ZORRO(0.6.x)的Pagination分页功能
  19. 可视化uniapp整合thinkphp6实现微信小程序支付
  20. textarea 标签内换行

热门文章

  1. 深入JVM锁机制2-Lock
  2. QMYSQL driver not loaded
  3. 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课
  4. AWK神器,继续案例
  5. 【转载】linux环境变量PS1的简介
  6. 2009年教师节祝福语大全
  7. “阿一web标准学堂”选修课:EditPlus高级使用技巧(附视频、课件、代码下载)...
  8. 是什么造成了网管员的低工资?
  9. 码云创建maven工程
  10. 数字化正在使CIO职责发生变化