现在好多网站上的注册都用了无刷新验证用户名,这种效果咋看感觉很复杂很难实现,其实它里面用到了Ajax中的核心xmlHttpRequest这个类,如果只是单单想实现这个效果,压根就不用引用Ajax.Net中的组件,因为感觉有点大材小用,下面是具体实现这种效果的方法,希望能给初学Ajax的朋友带来一点帮助.

      首先建立一个注册与验证的页面xmlHttpRequest.aspx与Validate.aspx,因为仅仅是实现无刷新验证用户名,所以我们可以把其它项都撇开,Register.aspx中摆好div跟控件,具体如下:
<body>
    
<form id="form1" runat="server">
        
<div style="width: 100%; float: left; text-indent: 24px; font-size:12px">
            
<div style="float:left">
                您的用户名:
<asp:TextBox ID="txtUserName" runat="server" style="border:1px solid #D4D8D9" onblur="return ValidateUser();"></asp:TextBox>
                
</div> <div id="default" ></div>
        
</div>
    
</form>
</body>

然后我们可以写两个样式用于用户名通过验证或未通过验证的显示样式,未加入图片.

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟.Error{ border:1px solid #A2553B;background-color:#FEF1E1;width:140px;float:left;height:18px;line-height:18px;margin-left:24px;color:#4F4F4F;text-indent:12px;}
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟.Right
{ border:1px solid #419041;background-color:#EDFCE7;width:140px;float:left;height:18px;line-height:18px;margin-left:24px;color:#4F4F4F;text-indent:12px;}

这两个样式你可以把它放到样式表中也可以将它放到<head></head>当中.
接下来只需敲一段脚本到注册的xmlHttpRequest.aspx页面去.

<script language="javascript" type="text/javascript">
  
function ValidateUser()
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟  
{
     
//获得用于显示验证是否通过的详细信息

     var obj=document.getElementById("default");
     
//获取用户输入的用户名的值

     var str=document.getElementById("txtUserName").value;
     
//定义一个bool型变量

     var chk=true;
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟    
if (chk)
{
       
//因为输入的用户名可能含有中文,所以将其解码

        var username=escape(str);
        
//用于验证用户名的后台页面

        var usrurl="/Validate.aspx?UserName="+username;
        
//获取从验证页面中异步传输过来的值

        var sta=GetResponseText(usrurl);
        
//如果异步传输失败         

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
        if(sta==false){
            chk
=true
;
            obj.className
="d_ok"
;
            obj.innerHTML
='该会员未能检测,可以尝试注册。'
;
        }

        
//异步传输成功
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
        else{
              
//假如传过来的值的开始位置是"regok",这个值是在验证页面Response.Write出来的值,如果是regok则表示验证通过,否则的话就是验证失败.

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
            if(sta.indexOf("regok")!=-1){
               
//验证通过

                chk=true;
                
//用于显示验证是否通过的详细信息加上刚刚所定义正确时的样式

                obj.className="Right";
                obj.innerHTML
='该会员名可以注册。'
;
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟            }
else{
                
//验证未通过

                chk=false;
                
//用于显示验证是否通过的详细信息加上刚刚所定义错误时的样式

                obj.className="Error";
                obj.innerHTML
='该会员名已经被注册。'
;
            }

        }

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟    }
else{
        obj.className
="Error"
;
    }

    
return chk;
  }

  
function GetResponseText(url)
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟  
{
      
//定义一个http_request变量

       var http_request;
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟        
if (window.XMLHttpRequest) 
{
                
//对于Mozilla、Netscape、Safari等浏览器,创建XMLHttpRequest对象

                http_request = new XMLHttpRequest();
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟                
if (http_request.overrideMimeType) 
{
                        
//如果服务器响应的header不是text/xml,可以调用其它方法修改该header

                        http_request.overrideMimeType('text/xml');
                }

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟        }
 else if (window.ActiveXObject) {
                
// 对于Internet Explorer浏览器,创建XMLHttpRequest

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
                try {
                        http_request 
= new ActiveXObject("Msxml2.XMLHTTP"
);
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟                }
 catch (e) {
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟                        
try 
{
                                http_request 
= new ActiveXObject("Microsoft.XMLHTTP"
);
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟                        }
 catch (e) {}
                }

        }

        
//打开验证页面的地址
       http_request.open('GET', url, false);
       http_request.send(
null
);
           
if (http_request.readyState == 4
)
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟           
{
               
// 收到完整的服务器响应

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
                   if (http_request.status == 200{
                          
//HTTP服务器响应的值OK

                             var requestdoc = http_request.ResponseText;
                }

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟                  
else {
              requestdoc 
= "error"
;
          }

    }

    
return requestdoc;
  }

</script>

核心代码:
http_request.ResponseText这句是用于获取验证用户名页面中异步传输过来的值..
上面的代码做了详细的注释,这里就不多做解释了..
接下来验证用户名的页面中接收传过来的值进行判断了...


public partial class Validate : System.Web.UI.Page
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟    
{
         
//获取url传过来的值

         private string UserName
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟         
{
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟             
get return Request.QueryString["UserName"].ToString(); }

         }

         
protected void Page_Load(object sender, EventArgs e)
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟        
{
            
//这里你可以连至用户表检查是否存在这个用户名,当然如果你用membership中的验证方法会更简洁.

            if (Server.HtmlEncode(UserName) =="123456")
               
//还记得脚本中的if(sta.indexOf("regok")!=-1)这句吗,regok就是这里的啦..

                Response.Write("regok");
            
else

                Response.Write(
"error");
        }

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟

注册用户页面代码如下

<script language="javascript" type="text/javascript">
var xmlHttp = false;
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
try 
{
   xmlHttp 
= new ActiveXObject("Msxml2.XMLHTTP"
);
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟}
 catch (e) {
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟   
try 
{
     xmlHttp 
= new ActiveXObject("Microsoft.XMLHTTP"
);
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟   }
 catch (e2) {
     xmlHttp 
= false
;
   }

}

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
if (!xmlHttp && typeof XMLHttpRequest != 'undefined'{
   xmlHttp 
= new
 XMLHttpRequest();
}

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
function callServer() {
   
var u_name = document.getElementById("tbUserName"
).value;
   
if ((u_name == null|| (u_name == "")) return
;
   
var url = "CheckUser.aspx?name=" +
 escape(u_name);
   xmlHttp.open(
"GET", url, true
);
   xmlHttp.onreadystatechange 
=
 updatePage;
   xmlHttp.send(
null
);  
}

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
function updatePage() {
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟   
if (xmlHttp.readyState < 4
{
test1.innerHTML
="loading..."
;
   }

Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟   
if (xmlHttp.readyState == 4{
     
var response =
 xmlHttp.responseText;
test1.innerHTML
=
response;
   }

//   if (test1.innerHTML=="已被注册"){
//
 document.form1.submit.disabled=true}else{
//
 document.form1.submit.disabled=false
//
   }
}

</script>
<span id="test1"></span>

CheckUser.aspx:
asp.net页面代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CheckUser.aspx.cs" Inherits="CheckUser" %>
<!--这个页里只能有上面的一行.不然不会返回数据-->
CheckUser.aspx.CS:

using *.*;
public partial class
 CheckUser : System.Web.UI.Page
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟
{
     
protected void Page_Load(object
 sender, EventArgs e)
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟     
{
         
string nam = Request.QueryString["name"
].ToString();
         
string sql = "select id from Users where username='" + nam + "'"
;
         SqlDataReader dr 
=
 DBHelper.ExecuteReader(sql);
         
if
 (dr.Read())
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟         
{
             Response.Write(
"此用户名已经被注册"
);
         }

         
else
Ajax实现无刷新验证(Asp.net源码) - 火云 - Asp.Net火云联盟         
{
             Response.Write(
"此用户名可以使用"
);
         }

         dr.Close();
     }

}


 

posted on 2011-09-15 23:19  csssky  阅读(266)  评论(0编辑  收藏  举报