创建自定义验证控件

using  System;
using  System.Web.UI;
using  System.Web.UI.WebControls;

/// <summary>
/// 自定义客户端,服务端验证
/// </summary>

public   class  AjaxValidator:BaseValidator,ICallbackEventHandler
{
    
public event ServerValidateEventHandler ServerValidate;
    
string _controlToValidateValue;

    
protected override void OnPreRender(EventArgs e)
    
{
        String eventRef 
= Page.ClientScript.GetCallbackEventReference(this"""""");
        
//注册包含文件
        String includeScript = Page.ResolveClientUrl("~/ClientScripts/AjaxValidator.js");
        Page.ClientScript.RegisterClientScriptInclude(
"AjaxValidator", includeScript);
        
//注册开始脚本
        String startupScript = String.Format("document.getElementById

(
'{0}').evaluationfunction='AjaxValidatorEvaluateIsValid';", this.ClientID);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "AjaxValidator", startupScript, true);
        
base.OnPreRender(e);
    }


    
/// <summary>
    
/// 只有支持回调脚本的浏览器才能够运行AJAX
    
/// </summary>
    
/// <returns></returns>

    protected override bool DetermineRenderUplevel()
    
{
        
return Context.Request.Browser.SupportsCallback();//浏览器是否支持回调脚本
    }


    
/// <summary>
    
/// 输入控件中的值是否有效
    
/// </summary>
    
/// <returns></returns>

    protected override bool EvaluateIsValid()
    
{
        
string controlToValidateValue = this.GetControlValidationValue(this.ControlToValidate);//获取与之关联的输入控件的值
        return ExecuteValidationFunction(controlToValidateValue);
    }


    
/// <summary>
    
/// 判断值是否有效
    
/// </summary>
    
/// <param name="controlToValidateValue"></param>
    
/// <returns></returns>

    private bool ExecuteValidationFunction(string controlToValidateValue)
    
{
        ServerValidateEventArgs args 
= new ServerValidateEventArgs(controlToValidateValue, this.IsValid);
        
if (ServerValidate != null)
            ServerValidate(
this, args);
        
return args.Value;
    }


    
ICallbackEventHandler 成员
}

从BaseValidator类继承,并实现了ICallBackEventHandler接口。ICallBackEventHandler接口定义了两个方法,当客户端发出AJAX请求时,这两个方法在服务器端调用。在OnPreRender()方法中,注册了一个内嵌JavaScript文件和启动脚本。内嵌JavaScript文件包含了AjaxValidator控件在客户端验证表单字段时调用的客户端函数。启动脚本把客户端的AjaxValidatiorEvaluateIsValid()函数和AjaxValidator控件关联起来。执行验证时,客户端验证框架自动调用这个JavaScript函数。
AjaxValidator.js:

//  AJAX服务器回调
function  AjaxValidatorEvaluateIsValid(val)
{
    
var value = ValidatorGetValue(val.controltovalidate);
    WebForm_DoCallback(val.id, value, AjaxValidatorResult, val, AjaxValidatorError, 
true); 
    
return true;
}


//  当结果从服务端返回的时候调用
function  AjaxValidatorResult(returnValue, context)
{
    
if (returnValue == 'True')
        context.isvalid 
= true;
    
else
        context.isvalid 
= false;
    ValidatorUpdateDisplay(context);
}


//  出错时调用
function  AjaxValidatorError(message)
{
    alert(
'Error: ' + message);
}

JavaScript方法AjaxValidatorEvaluateIsValid()通过调用WebForm_DoCallback()方法初始化一个AJAX调用。该方法调用AjaxValidtor控件关

联的服务器端验证函数。当AJAX调用完成时,再调用AjaxValidatorResult()方法。这个方法在客户端更新验证控件的显示。

ShowAjaxValidator.aspx

<% @ Page Language="C#" AutoEventWireup="true" CodeFile="ShowAjaxValidator.aspx.cs" Inherits="ShowAjaxValidator"  %>
<% @ Register TagPrefix="custom" Namespace="MyControl"  %>
<! 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  runat ="server" >
    
< title > 无标题页 </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
        
< div >
    
< asp:Label
        
id ="lblUserName"
        Text
="用户名:"
        AssociatedControlID
="txtUserName"
        Runat
="server"   />
    
< asp:TextBox
        
id ="txtUserName"
        Runat
="server"   />
    
< custom:AjaxValidator
        
id ="AjaxValidator1"
        ControlToValidate
="txtUserName"
        Text
="用户已存在!"
        OnServerValidate
="AjaxValidator1_ServerValidate"  
        Runat
="server"   />< br  />
    
< asp:Button
        
id ="btnSubmit"
        Text
="Submit"
        Runat
="server"  OnClick ="btnSubmit_Click"   />
    
</ div >
    
</ form >
</ body >
</ html >
ShowAjaxValidator.aspx.cs:
     protected   void  btnSubmit_Click( object  sender, EventArgs e)
    
{
        
if (this.Page.IsValid)
        
{
            RegisterClientScriptBlock(
"d""<script>alert('注册成功!')</script>");
        }

        
else
        
{
            RegisterClientScriptBlock(
"d""<script>alert('注册失败!')</script>");
        }

    }


    
protected   void  AjaxValidator1_ServerValidate( object  source, ServerValidateEventArgs args)
    
{
        
if (UserNameExists(args.Value))
        
{
            args.IsValid 
= true;
        }

        
else
        
{
            args.IsValid 
= false;
        }

    }


    
private   bool  UserNameExists( string  userName)
    
{
        SqlConnection con 
= new SqlConnection("server=finetdb2000;database=finetdb;uid=finetdb;pwd=finetdb;");
        SqlCommand cmd 
= new SqlCommand("select count(username) from users where username=@username", con);
        cmd.Parameters.Add(
"@username", SqlDbType.VarChar, 20).Value = userName;
        
bool result = false;
        
using (con)
        
{
            con.Open();
            
int count = (int)cmd.ExecuteScalar();
            
if (count <= 0)
            
{
                
return true;
            }

        }


        
return result;
    }

你可能感兴趣的:(自定义)