首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

Ajax XMLHttpRequest 请求有关问题

2013-06-25 
Ajax XMLHttpRequest 请求问题本帖最后由 Javkburd 于 2013-04-25 22:48:48 编辑我用VS2012 做一个简单的

Ajax XMLHttpRequest 请求问题
本帖最后由 Javkburd 于 2013-04-25 22:48:48 编辑 我用VS2012 做一个简单的注册验证,身份证前3位代表省份编号,各省份的相关信息存在数据库里。现在要对此进行验证(还没有进行身份证号其他方面的验证),用微软自带的自定义控件CustomValidator的ClientValidationFunction实现,即

<asp:CustomValidator ID="cvIdentity" runat="server" ControlToValidate="txtIdentity" ErrorMessage="身份证号错误" SetFocusOnError="True"
             OnServerValidate="cvIdentity_ServerValidate" ClientValidationFunction="Identity_ClientValidate"></asp:CustomValidator>

客户端验证函数定义如下:
function Identity_ClientValidate(source, args)
{
    var str = args.Value;

    if(str.length < 3)
    {
        if (str.length != 0)
        {
            args.IsValid = false;
        }

        return;
    }

    var xmlHttp = new XMLHttpRequest();

    var url = "CheckProCode.aspx" + "?ID=" + str;

    xmlHttp.onreadystatechange = function ()
    {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
        {
            if (xmlHttp.responseText == "身份证号错误")
            {
                args.IsValid = false;
            }
        }
    }

    xmlHttp.open("GET", url, true);

    xmlHttp.timeout = 10000;

    xmlHttp.send(null);
}


请求页面CheckProCode.aspx就是连接数据库,返回responseText,如下:
protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            string ConStr = WebConfigurationManager.ConnectionStrings["SqlConString"].ToString();
            string code = Request.QueryString["ID"].Substring(0, 3);

            SqlConnection Con = new SqlConnection(ConStr);

            Con.Open();

            SqlCommand Cmd = new SqlCommand("SELECT * FROM PROVINCE WHERE DigitalCode =" + code, Con);

            SqlDataReader dtrSql = Cmd.ExecuteReader();

            if (!dtrSql.HasRows)
            {


                Response.Write("身份证号错误");
            }

            dtrSql.Close();
            Con.Close();
        }
    }



其实过程并不复杂,但是调试时总是出现INVALID_STATE_ERR: DOM Exception 11(完成该操作所需的数据还不可使用),调试后才知道应该就是xmlHttp.status不可用,因为在这会抛出异常,到底是为什么?还是别的原因?清楚地麻烦说下。。。
[解决办法]
没看出有什么问题。。已经判断readySate是否为4了,调用responseText属性应该没问题的

   var url = "CheckProCode.aspx" + "?ID=" + str+'&_dc='+new Date().getTime();


加时间戳试试~
[解决办法]
var xmlHttp = new XMLHttpRequest();
不是对每款浏览器都有效的

CheckProCode.aspx 只在验证错误时有输出
[解决办法]
引用:
引用:var xmlHttp = new XMLHttpRequest();
不是对每款浏览器都有效的

CheckProCode.aspx 只在验证错误时有输出
你说的XMLHttpRequest对象在我的Firefox, Chrome和 Safafi下都支持,所以不存在这个问题。至于你说的“CheckProCode.aspx ……


 = =可不就是验证失败的时候才有输出“身份证号错误”么,验证成功的你没输出的。

代码没啥问题啊,要不你把xmlhttp.status == 200去掉吧。其实前面那个就够用了。不过我记得还有一个状态的,想不起来了,jquery用多了,人都变蠢了。

另外,你这个是不支持IE的,创建xmlhttp对象的时候,IE下是不能这么创建的。具体的自己百度一下哈。。很多封装好了的函数,可以直接用。
[解决办法]
但是产生 INVALID_STATE_ERR: DOM Exception 11 错误的一个主要原因是超时
所以你验证成功应返回数据,哪怕是一个空格

只有这样才能缩小问题检查的范围
[解决办法]
 if (xmlHttp.readyState == 4)
        {
if(xmlHttp.status == 200){
            if (xmlHttp.responseText == "身份证号错误")
            {
                args.IsValid = false;
            }
}else alert('动态页出错鸟~~\n'+xmlHttp.responseText)
        }

拆分成上面那样试试,出这个问题一般是readystate不为4的时候就调用了responseText或者responseXML属性
[解决办法]
我的理解是不管你是异步还是同步,必须在timeout之前把response.end()。

对于你服务器来说同步异步没区别,同步异步只是相对前端而言的,同步的时候必须等ajax请求结束以后才会执行下面的代码(就是send后面的),而异步是一直向下执行,等数据回来以后再执行callback里的代码。

看上面有人说过是因为超时的原因,我想就是response.end()你之前一直没有调用吧。

有些地方会用到模拟长连接(不是轮询)就是这样一直不end,后台查询到数据的时候才会end。
[解决办法]
你的问题和函数异步返回ajax的值类似。。ajax异步执行完设置args.IsValid时ms注册的检查这个属性是否为true已经执行过了,在设置就没有什么作用了,所以不会显示错误信息。

看了下ms注册js代码,需要修改下ms的验证逻辑,具体代码给忘记,明天再测试下看怎么fix



调用下面的func方法永远得不到ajax的返回值,和你的这个要求类似

function func(){
 var r='';
var xhr=new XMLHttpRequest();
xhr.open("get","xxxx.url",true);
xhr.onreadystatechange=function(){
  if(xhr.readyState==4&&xhr.status==200)r=xhr.responseText;
}
xhr.send(null);
  return r;
}


至于你碰到的NVALID_STATE_ERR: DOM Exception错误,我firefox和chrome测试都没有报这个错误
[解决办法]
引用:
刚说错了,异步是这样的,同步没问题,因为同步状态一次就变为4. 如果onreadystatechange函数写在open前面,那就会有问题,因为中间有一个状态1,此时就会返回。这两者位置也有影响。。。


不是同步一次变为4,是同步会挂起js代码的执行,异步不会挂起,js代码继续执行ms的验证已经执行完毕了才轮到ajax异步设置args参数的IsValid属性

参考这篇文章解决你的问题:asp.net CustomValidator Ajax 异步验证如何触发

热点排行