asp.net CustomValidator Ajax 异步验证如何触发
使用asp.net的CustomValidator验证控件时,如果ClientValidationFunction配置的函数中使用异步Ajax进行验证输入内容的有效性时,即使ajax返回的信息无效,并且设置了ClientValidationFunction配置函数的参数args.IsValid=false,并不会显示错误信息。
这是因为ajax异步执行完设置args.IsValid时ms注册的检查这个属性是否为true的代码已经执行过了,所以ajax再设置args.IsValid就没什么作用了,不会再次触发ms注册检查args.IsValid事件。
这个和函数返回异步ajax的值类似,调用下面的func方法永远得不到ajax的返回值。因为return r先于if(xhr.readyState==4&&xhr.status==200)r=xhr.responseText;这句的执行。
function func(){ var r=''; var xhr=window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsoft.xmlhttp"); xhr.open("get","xxxx.url",true); xhr.onreadystatechange=function(){ if(xhr.readyState==4&&xhr.status==200)r=xhr.responseText; } xhr.send(null); return r; }
对于上面这个问题,ajax异步执行,后续的操作一般需要放到回调函数。或者确实需要通过函数返回根据ajax结果返回需要的值,那么需要将ajax设置为同步,而不是异步,这样就会挂起return r的执行直到ajax返回设置完r变量的值。
xhr.open("get","xxxx.url",/*true*/false);//设置为同步
由于使用的是微软的CustomValidator验证控件,要修改微软注册的检查事件放到ajax回调中非常麻烦。但是也不是没有办法,解决办法有2种
1)将ajax请求设置为同步的,同步在网速慢时体验很不好,浏览器假死。
2)需要调整下表单的onsubmit事件,防止验证未通过也会提交表单。ajax回调中触发ms注册的验证事件,以便显示隐藏错误。居于ajax异步验证的CustomValidator源代码如下
备注:本示例基于framework2.0,如果是其他版本的framework,可能微软注册的客户端javascript有不同
xxx.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxx.aspx.cs" Inherits="xxx" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="content-type" content="text/html;charset=utf-8" /><title>asp.net CustomValidator Ajax 异步验证如何触发</title></head><body> <form id="form1" runat="server"> <asp:TextBox runat="server" ID="txtIdentity"></asp:TextBox> <!--注意添加ValidateEmptyText="true",这样可以触发自定义的ClientValidationFunction,要不不会触发--> <asp:CustomValidator ID="cvIdentity" ValidateEmptyText="true" runat="server" ControlToValidate="txtIdentity" ErrorMessage="身份证号错误" SetFocusOnError="True" ClientValidationFunction="Identity_ClientValidate"></asp:CustomValidator> <asp:Button runat="server" ID="btn" Text="POST" /> <script> function triggerCustomValiator(source, isvalid) {//提供给ajax异步调用接受后设置CustomValidator是否有效以便显示或者隐藏错误信息 var v = window[source.id]; //得到ms注册的验证对象 v.isvalid = isvalid; //设置是否有效 ValidatorUpdateDisplay(v); //设置验证信息容器隐藏或者显示 } var ajaxCheck = false; //默认客户端ajax检查不通过 function Identity_ClientValidate(source, args) { var str = args.Value; if (str.length < 3) { args.IsValid = false; return; } var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("microsoft.xmlhttp"); var url = "xxx.aspx?id=" + str + '&_dc=' + new Date().getTime() ; xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { ajaxCheck = xhr.responseText != '身份证号错误'; triggerCustomValiator(source, ajaxCheck); } } xhr.open("GET", url, true); xhr.send(null); } theForm.onsubmit = function () {//改写表单提交submit事件,增加异步的ajax检查 if (!ajaxCheck) return false; //ajax检查不通过,不提交表单 return WebForm_OnSubmit() } </script> </form></body></html>
xxx.aspx.cs
using System; public partial class xxx : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string id = Request.QueryString["id"]; if (!string.IsNullOrEmpty(id)) { if (id != "123") Response.Write("身份证号错误"); Response.End();//结束输出aspx页面上的html代码 } } }
加支付宝好友偷能量挖...
原创文章,转载请注明出处:asp.net CustomValidator Ajax 异步验证如何触发