如果非要用CustomValidator+WebService+asp.net ajax进行验证
有些事情做起来很别扭,但不是不能做!
在最常见的验证用户名是否存在的功能中,我以前常用xmlhttp请求一个页面来验证,这种方式简单,如下面代码所示:
前台JS代码
![](/Images/OutliningIndicators/ContractedBlock.gif)
后台页面代码:
![](/Images/OutliningIndicators/ContractedBlock.gif)
这种方式,只需在后台写一个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", true, true);
context.targetedControl.dispatchEvent(e);
}
}
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", true, true);
context.targetedControl.dispatchEvent(e);
}
}
后台的代码很简单,只是一个WEB服务:
![](/Images/OutliningIndicators/ContractedBlock.gif)
现在好了,简单的一行代码,现在变成了N行,确实是一个别扭的实现吧?
不过,这里确实有几个知识点:
1. 在FF中查找事件
2. FF中的FireEvent
请博友们指正。
QQ:273352165
evlon#126.com
转载请注明出处。