如果非要用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

请博友们指正。

posted @ 2008-12-09 16:25  阿牛  阅读(1171)  评论(0编辑  收藏  举报