注册时检测用户是否已存在(自定义验证控件+jQuery.Ajax)
本想在自定义验证控件(asp:CustomValidator)的客户端验证属性里(ClientValidationFunction)来写ajax访问的,若存在则让它的arguments.IsValid=!用户存在,但无奈ajax是异步调用,等不到它调用ClientValidationFunction的javascript函数已经执行完毕,所以此路跟本行不通。那就只能用一个全局javascript变量user_exist来存用户是否存在的信息,ajax调用完成给它赋值,在注册按钮按下时判断。只能如此了……
- <script type="text/javascript" language="javascript" src="scripts/jQuery/jquery-1.2.6-vsdoc.js"></script>
- <script type="text/javascript" language="javascript">
- <!--
- var user_is_exist = true;//全局变量,用户是否存在
- function UserExistValidate(source, arguments) {
- var username = jQuery.trim(arguments.Value);
- //验证1,必需有
- if (username.length == 0) {
- arguments.IsValid = false;//验证不通过
- return;
- }
- //验证2,以字母开头且只包含大小写字母和下划线
- //var reg_user = new RegExp("[a-zA-Z]{1}[a-zA-Z0-9//_]{2,14}");
- var reg_user = /^[a-zA-Z]{1}[a-zA-Z0-9//_]{2,14}$/;
- if (!reg_user.test(username)) {
- //alert("用户名不符合规范");
- arguments.IsValid = false;//验证不通过
- return;
- }
- //验证3,在数据库中尚未注册过的
- jQuery.ajax({
- type: "GET",
- url: "F_Checker.aspx",
- data: "u=" + username,
- success: function(msg) {
- if (msg == "T") {
- user_is_exist = true;
- jQuery("#span_user_exist").css("color", "#f00");
- jQuery("#span_user_exist").text("该用户名已经被占用.");
- }
- else if (msg == "F") {
- user_is_exist = false;
- jQuery("#span_user_exist").css("color", "#0f0");
- jQuery("#span_user_exist").text("用户名尚未被使用.");
- }
- arguments.IsValid = !user_is_exist; //跟本就没用(验证通过与否)
- }//,
- //async: false //同步也没用
- });
- }
- function checkUserExist() {
- if (user_is_exist) {
- alert("用户名已经被占用,不能注册!");
- return false;
- }
- return true;
- }
- // -->
- </script>
- <asp:TextBox ID="txt_username" runat="server" ValidationGroup="reg"></asp:TextBox>
- <asp:CustomValidator ID="cv_user_exist" runat="server" ControlToValidate="txt_username"
- ErrorMessage="用户帐号必需以字母开头且3位以上" ValidationGroup="reg"
- ClientValidationFunction="UserExistValidate" Display="Dynamic"
- ValidateEmptyText="True" Font-Size="10"></asp:CustomValidator>
- <span id="span_user_exist"></span>
- <asp:Button ID="btn_register" runat="server" Text="注册" ValidationGroup="reg"
- onclientclick="return checkUserExist();" />
F_Checker.aspx页面访问数据库,只返回“T”或“F”。
效果:
2009-01-13补:
呵呵,我知道了,用同步的方法来:
- //验证3,在数据库中尚未注册过的
- var result_text= //这样就OK-1
- jQuery.ajax({
- type: "GET",
- url: "F_Checker.aspx",
- data: "u=" + username,
- success: function(msg) {
- if (msg == "T") {
- user_is_exist = true;
- jQuery("#span_user_exist").css("color", "#f00");
- jQuery("#span_user_exist").text("该用户名已经被占用.");
- }
- else if (msg == "F") {
- user_is_exist = false;
- jQuery("#span_user_exist").css("color", "#0f0");
- jQuery("#span_user_exist").text("用户名尚未被使用.");
- }
- },
- async : false //这样就OK-2
- }).responseText; //这样就OK-3
- //alert(result_text);
- if(result_text=="T")
- arguments.IsValid = false; //验证不通过