验证用户名是否存在的功能已经实现了,但是现在又遇到问题了,当我点击ibtnSubmitReg这个注册按钮的时候,我调用CheckResult()这个函数判断用户是否验证通过,通过了就执行后台的代码,向数据库中添加记录!
但是现在的问题是当用户通过的验证,点击ibtnSubmitReg按钮,不能执行后台的代码,也就是说CheckUserName()这个函数返回的始终都是false!是ajax那块的问题!我调试的很久没找出问题!请教高手帮忙看看!<asp:ImageButton ID="ibtnSubmitReg" OnClientClick="if(!CheckResult()) return false;"
                    ImageUrl="~/images/reg_submit.gif" runat="server" 
                    onclick="ibtnSubmitReg_Click" />
 //验证用户名
        var req;
        function CheckUserName() {
            var uName = document.getElementById('<%=txtUserName.ClientID%>').value;
            var uNameMs = document.getElementById('<%=uNameMessage.ClientID%>');
            if (uName != "") {
                        req = GetXmlHttpRequest();
                        req.open("get", "../ClientHandle/GetUserExists.ashx?userName=" + uName);
                        req.onreadystatechange = function() {
                            if (req.readyState == 4) {
                                if (req.status == 200) {
                                    if (req.responseText == "1") {
                                        uNameMs.innerHTML = "<img class='check_img' src='images/no.jpg' alt='' />&nbsp;用户名已存在";
                                        //alert("false");
                                        return false;
                                    }
                                    else {
                                        uNameMs.innerHTML = "<img class='check_img' src='images/yes.jpg' alt='' />";
                                        //alert("true");
                                        return true;
                                    }
                                }
                            }
                        }
                        req.send(null);
            }
            else {
                uNameMs.innerHTML = "<img class='check_img' src='images/no.jpg' alt='' />&nbsp;用户名不能为空";
                return false;
            }
        }//Ajax验证
        function GetXmlHttpRequest() {
            var http_request;
            if (window.XMLHttpRequest) {
                //如果是Mozilla浏览器
                http_request = new XMLHttpRequest();
                if (http_request.overrideMimeType) {
                    http_request.overrideMimeType("text/xml");
                }
            }
            else if (window.ActiveXObject) {
                //如果是IE浏览器
                try {
                    http_request = new ActiveXObject("Msxml2.XMLHTTP");
                }
                catch (e) {
                    try {
                        http_request = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    catch (e) { }
                }
            }
            return http_request;
        }
//获取验证是否通过
        function CheckResult() {
            if (CheckUserName()) {
                return true;
            }
            else {
                return false;
            }
        }服务器端代码:public class GetUserExists : IHttpHandler
    {        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            SqlDataReader dr = SqlHelper.ExecuteReader(CommandType.Text, "select uid from users where username = @username", new SqlParameter("@username", context.Request["userName"].ToString()));
            if (dr.Read())
            {
                context.Response.Write("1");
            }
            else
            {
                context.Response.Write("0");
            }
        }        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

解决方案 »

  1.   

    你alert(CheckUserName()) 看看就知道了
      

  2.   


    我在CheckResult()里看的是false,但是我的验证已经通过了,
    执行了else {
                                            uNameMs.innerHTML = "<img class='check_img' src='images/yes.jpg' alt='' />";
                                            //alert("true");
                                            return true;这个代码后,应该为true啊?
      

  3.   

    public class RegistValidate : IHttpHandler
        {        public void ProcessRequest(HttpContext context)
            {
                string username = HttpUtility.UrlDecode(context.Request.QueryString["username"].ToString());
                if (SysUserBLL.Exists("UserID", Util.FormatInputStr(username)))
                {
                    context.Response.Write("该用户名已经有人使用!" + username);
                }
                else
                {
                    context.Response.Write("OK");
                }            System.Threading.Thread.Sleep(1000);
            }        public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }http://topic.csdn.net/u/20100420/11/5d938f4b-067e-446b-9cea-aaee8d70b5dd.html
      

  4.   

    return true 是给CheckUserName返回值吗?不要搞错哦,它毫无意义,只是你的req调用了内部的一个函数,这个函数返回什么都无所谓。
      

  5.   

    凡是你遇到异步、回调,都要有深一点的理论知识,能够稍微耐心地看懂流程。比如说CheckUserName异步调用ajax方法,当它执行open、send之后立刻就结束了。根本不用等onreadystatechange注册的函数执行,此时CheckUserName函数就结束了(当然返回了默认值)。这才是异步的含义。
      

  6.   

    嗯,去学个大家的、成熟的实现Ajax的方式吧。比如http://www.google.com.hk/search?q=asp.net+scriptservice&hl=zh-CN&safe=strict&prmd=fd&source=lnt&tbs=lr:lang_1zh-CN|lang_1zh-TW&lr=lang_zh-CN|lang_zh-TW&sa=X&ei=LiL6TIHWIM_JrAfb6uy8CA&ved=0CAcQpwU
      

  7.   

    写反了
    OnClientClick="if(!CheckResult()) return false;"
      

  8.   

    加个全局变量
    var isCheck = "false";if (req.readyState == 4) {
                                    if (req.status == 200) {
                                        if (req.responseText == "1") {
                                            uNameMs.innerHTML = "<img class='check_img' src='images/no.jpg' alt='' />&nbsp;用户名已存在";
                                            //alert("false");
                                            isCheck = "false";
                                            return false;
                                        }
                                        else {
                                            uNameMs.innerHTML = "<img class='check_img' src='images/yes.jpg' alt='' />";
                                            //alert("true");
                                            isCheck = "true"
                                            return true;
                                        }
                                    }
                                }改为
    if (req.readyState == 4) {
                                    if (req.status == 200) {
                                        if (req.responseText == "1") {
                                            uNameMs.innerHTML = "<img class='check_img' src='images/no.jpg' alt='' />&nbsp;用户名已存在";
                                            //alert("false");
                                            return false;
                                        }
                                        else {
                                            uNameMs.innerHTML = "<img class='check_img' src='images/yes.jpg' alt='' />";
                                            //alert("true");
                                            return true;
                                        }
                                    }
                                }在注册时判断isCheck的值就行了
      

  9.   

    上面两个JScript code中的代码写反了
      

  10.   

    我这个问题应该怎么解决啊?
    我刚学XMLHttpRequest这个对象,不怎么会!
      

  11.   

      System.Threading.Thread.Sleep(1000);这句的作用是?
      

  12.   

    ajax不是这样用的
    因为是在异步执行
    当你执行CheckResult()的时候,程序已经向后运行了return false;而ajax请求还没有执行,这时候处于等待服务器返回的状态
    解决方法:你可以这样, 把这个按钮生成onclick的javascript复制出来(通过查看原代码 )然后放到你的ajax代码这段下面
    if (req.responseText == "1") {
     //在这里放上那个按钮生成的onclick=""代码...这样,就会等到服务器返回后才执行按钮的onclick命令了,
      

  13.   


    req.open("get", "../ClientHandle/GetUserExists.ashx?userName=" + escape(uName),false);