• 如果非要用CustomValidator+WebService+asp.net ajax进行验证


        有些事情做起来很别扭,但不是不能做!

        在最常见的验证用户名是否存在的功能中,我以前常用xmlhttp请求一个页面来验证,这种方式简单,如下面代码所示:

    前台JS代码

    Code

    后台页面代码:

    Code

       这种方式,只需在后台写一个HttpHandler,处理一下这个请求,返回true|false就行,当然要做一下安全检查,如这个IP今天提交的频率。我个人感觉这个方法简单有效!

        但今天的话题是,如果非要用CustomValidator+WebService+asp.net ajax进行验证呢?最烦较真说不能。写了一个很别扭的实现示例如下:   

            // use by FF to findout event object
            function searchEvent()
            {
                func 
    = searchEvent.caller;
                
    while(func != null)
                {
                    
    var arg0 = func.arguments[0];
                    
    if( arg0 )
                    {
                        
    if( arg0.constructor == Event) // Got it
                            return arg0;
                    }
                    func 
    = func.caller;
                }
                
    return null;
            }
            
            
    //自定义验证函数,这个函数将被执行两次 coder:evlon#126.com
            function checkIsValid(sender, args){
                
                
    if(!sender.valid_result){
                    sender.valid_result 
    = {validing :false,result: null};
                }
                
                
                
    if(!sender.valid_result.validing) {
                    
    //第一次,要调用WEB服务去检查
                    var e = window.event || searchEvent();  //得到事件
                    var targetedControl;    //通过下面的步骤,去找到事件源
                    if ((typeof(e.srcElement) != "undefined"&& (e.srcElement != null)) {
                        targetedControl 
    = e.srcElement; 
                    }
                    
    else {
                        targetedControl 
    = e.target;
                    }
                    
                    
    //给事件源加上一点自定义的信息
                    sender.valid_result.validing = true;
                    
                    
    //调用WEB服务,并生成要传递的上下文
                    User.CheckIsValid(args.Value,checkIsValidResult,null,{sender:sender,args:args,targetedControl:targetedControl});

                }
                
    else {
                    
    //第二次执行了,直接从sender中取出结果,返回
                    args.IsValid = sender.valid_result.result;
                    sender.valid_result.validing 
    = false;
                }
                
           }

           
    function checkIsValidResult(result, context) {
                
    //把WEB服务的返回结果,保存在事件源中
               context.sender.valid_result.result = result;
                
                
    //再次引发onchange,从而验证
                if(context.targetedControl.fireEvent)
                {
                    context.targetedControl.fireEvent(
    'onchange');
                }
                
    else
                {
                    
    var e = document.createEvent('MouseEvents');
                    e.initEvent(
    "change"truetrue);
                    context.targetedControl.dispatchEvent(e);
                }
           
           }

    后台的代码很简单,只是一个WEB服务:

    Code

    现在好了,简单的一行代码,现在变成了N行,确实是一个别扭的实现吧?

    不过,这里确实有几个知识点:

    1. 在FF中查找事件

    2. FF中的FireEvent

    请博友们指正。

  • 相关阅读:
    四则运算
    Git工具学习整理
    java拦截器中使用的动态代理
    Java动态代理
    Git常用命令
    Maven学习
    ruby调用jenkins API使用
    c#认证考试第四章(国庆作业及其总结)
    C#认证考试第三章
    c#认证考试练习题目
  • 原文地址:https://www.cnblogs.com/evlon/p/1351216.html
Copyright © 2020-2023  润新知