创建自定义验证控件 (asp.net C#)

学习如何创建自定义验证控件。我们将创建两个自定义控件,首先创建LengthValidator控件,它用于验证表单字段中的内容的长度;然后创建 AjaxValidator控件。AjaxValidator控件通过把信息传到定义在服务器端的自定义函数来在客户端执行验证。

我们通过从BaseValidator 类派生一个新的控件来创建新的验证控件。如名字所示,BaseValidator类是所有验证控件的基类,包括RequiredFieldValidator控件和RegularExpressionValidator控件。

BaseValidator类是一个抽象(abstract)类,它要求子类必须实现一个方法:

q EvaluateIsValid——当被检验的表单字段通过验证时返回True。

BaseValidator类也包含一些其他的方法,可以重写(override)或做别的用途。这些方法中最有用的是下面这个:

q GetControlValidationValue——用于获取被验证的控件的值。

创建自定义验证控件时,要重写EvaluateIsValid()方法,并在EvaluateIsValid()方法中调用GetControlValidationValue来获得被验证的表单字段的值。

3.8.1 创建LengthValidator控件

为了展示创建自定义验证控件的一般技巧,本节将先创建一个非常简单的、用于验证表单字段长度的自定义验证控件——LengthValidator控件。

代码清单3-20包含了LengthValidator控件的代码。

代码清单3-20 LengthValidator.cs

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace myControls

{

    /// <summary>

    /// Validates the length of an input field

    /// </summary>

    public class LengthValidator : BaseValidator

    {

        int _maximumLength = 0;

        public int MaximumLength

        {

            get { return _maximumLength; }

            set { _maximumLength = value; }

        }

        protected override bool EvaluateIsValid()

        {

            String value = this.GetControlValidationValue(this.ControlToValidate);

            if (value.Length > _maximumLength)

                return false;

            else

                return true;

        }

    }

}

代码清单3-20包含一个类,它从 BaseValidator类继承。这个新的类重写了EvaluateIsValid()方法,被验证的控件的值在 GetControlValidationValue()方法的帮助下取得,然后这个值的长度与MaximumLength属性进行比较。

注解   使用代码清单3-20中的类,需要把该类添加到应用程序的App_Code文件夹中。所有加入到这个特殊文件夹的类都会自动被ASP.NET Framework编译。

代码清单3-21中的页面使用LengthValidator控件验证评论输入框的长度(见图3-16)。

代码清单3-21 ShowLengthValidator.aspx

<%@ Page Language="C#" %>

<%@ Register TagPrefix="custom" Namespace="myControls" %>

<!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 id="Head1" runat="server">

    <title>Show Length Validator</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

 

    <asp:Label

        id="lblComments"

        Text="Comments:"

         AssociatedControlID="txtComments"

        Runat="server" />

    <br />

    <asp:TextBox

        id="txtComments"

        TextMode="MultiLine"

        Columns="30"

        Rows="2"

        Runat="server" />

    <custom:LengthValidator

        id="valComments"

        ControlToValidate="txtComments"

        Text="(Must be less than 10 characters)"

        MaximumLength="10"

        Runat="server" />

 

    <br /><br />

 

    <asp:Button

        id="btnSubmit"

        Text="Submit"

        Runat="server" />

 

    </div>

    </form>

</body>

</html>

图3-16 用LengthValidator控件验证字段的长度

注意在页面的顶部,用<%@ Register %>指令注册了LengthValidator控件。如果需要在应用程序的多个页面中使用这个控件,那么可换到在应用程序的Web配置文件的<Pages>节中注册控件。

3.8.2 创建AjaxValidator控件

本节创建AjaxValidator这个非常有用的 控件。像CustomValidator一样,AjaxValidator控件用于创建一个服务器端的自定义验证函数。但不同于 CustomValidator控件,AjaxValidator控件可以在浏览器调用自定义的验证函数。

AjaxValidator控件使用AJAX(Asynchronous JavaScript and XML)从客户端调用服务器端验证函数。使用AJAX的优势在于,用户不用显式地回传服务器端。

例如,假设创建一个网站注册表单,并且需要验证用户名字段,以确认用户输入的用户名在数据库中并不存在。AjaxValidator控件可以在客户端调用服务器端的验证函数来检查用户名在数据库中是否唯一。

代码清单3-22包含了AjaxValidtor控件的代码。

代码清单3-22 AjaxValidator.cs

using System;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace myControls

{

    /// <summary>

    /// Enables you to perform custom validation on both the client and server

    /// </summary>

    public class AjaxValidator : BaseValidator, ICallbackEventHandler

    {

        public event ServerValidateEventHandler ServerValidate;

        string _controlToValidateValue;

        protected override void OnPreRender(EventArgs e)

        {

            String eventRef = Page.ClientScript.GetCallbackEventReference(this, "", "", "");

            // Register include file

            String includeScript = Page.ResolveClientUrl("~/ClientScripts/AjaxValidator.js");

            Page.ClientScript.RegisterClientScriptInclude("AjaxValidator", includeScript);

            // Register startup script

            String startupScript = String.Format("document.getElementById('{0}').evaluationfunction

* = 'AjaxValidatorEvaluateIsValid';", this.ClientID);

            Page.ClientScript.RegisterStartupScript(this.GetType(), "AjaxValidator", startupScript, true);

            base.OnPreRender(e);

        }

        /// <summary>

        /// Only do the AJAX on browsers that support it

        /// </summary>

         protected override bool DetermineRenderUplevel()

        {

            return Context.Request.Browser.SupportsCallback;

        }

        /// <summary>

        /// Server method called by client AJAX call

        /// </summary>

        public string GetCallbackResult()

        {

            return ExecuteValidationFunction(_controlToValidateValue).ToString();

        }

        /// <summary>

        /// Return callback result to client

        /// </summary>

        public void RaiseCallbackEvent(string eventArgument)

        {

            _controlToValidateValue = eventArgument;

        }

        /// <summary>

        /// Server-side method for validation

        /// </summary>

        protected override bool EvaluateIsValid()

        {

            string controlToValidateValue = this.GetControlValidationValue(this.ControlToValidate);

            return ExecuteValidationFunction(controlToValidateValue);

        }

        /// <summary>

        /// Performs the validation for both server and client

       /// </summary>

        private bool ExecuteValidationFunction(String controlToValidateValue)

        {

            ServerValidateEventArgs args = new ServerValidateEventArgs(controlToValidateValue, this.IsValid);

            if (ServerValidate != null)

                ServerValidate(this, args);

            return args.IsValid;

        }

    }

}

代码清单3-22中的控件从BaseValidator类继承,并实现了ICallBackEventHandler接口。ICallBackEventHandler接口定义了两个方法,当客户端发出AJAX请求时,这两个方法在服务器端调用。

在OnPreRender()方法中,注册了一个内 嵌JavaScript文件和启动脚本。内嵌JavaScript文件包含了AjaxValidator控件在客户端验证表单字段时调用的客户端函数。启 动脚本把客户端的AjaxValidatiorEvaluateIsValid()函数和AjaxValidator控件关联起来。执行验证时,客户端验 证框架自动调用这个JavaScript函数。

代码清单3-23包含AjaxValidator控件使用的JavsScript函数。

代码清单3-23 AjaxValidator.js

// Performs AJAX call back to server

function AjaxValidatorEvaluateIsValid(val)

{

    var value = ValidatorGetValue(val.controltovalidate);

    WebForm_DoCallback(val.id, value, AjaxValidatorResult, val, AjaxValidatorError, true);

    return true;

}

// Called when result is returned from server

function AjaxValidatorResult(returnValue, context)

{

    if (returnValue == 'True')

        context.isvalid = true;

    else

        context.isvalid = false;

    ValidatorUpdateDisplay(context);

}

// If there is an error, show it

function AjaxValidatorError(message)

{

    alert('Error: ' + message);

}

JavaScript方法 AjaxValidatorEvaluateIsValid()通过调用WebForm_DoCallback()方法初始化一个AJAX调用。该方法调 用AjaxValidtor控件关联的服务器端验证函数。当AJAX调用完成时,再调用AjaxValidatorResult()方法。这个方法在客户 端更新验证控件的显示。

代码清单3-24中的页面展示了如何使用AjaxValidator控件。该页面处理AjaxValidator控件的ServerValidate事件以将一个自定义验证函数关联到该控件上。

代码清单3-24中的页面包含输入用户名和喜爱颜色的字段的表单。提交表单后,这些字段的值就插入到数据库User表中。

在代码清单3-24中,验证函数检查用户名是否在数据库中已经存在。如果输入的用户名已经存在,就会显示一个验证错误。提交表单返回到服务器端之前,这个信息就会显示在浏览器中(见图3-17)。

重要的一点是,要认识到AjaxValidtor控件可以关联任何服务器端验证函数,可以执行数据库查询,调用Web服务(Web Service)或运行一个复杂的数学函数。无论定义在服务器端的函数是什么都可自动被客户端调用。

代码清单3-24 ShowAjaxValidator.aspx

<%@ Page Language="C#" %>

<%@ Register TagPrefix="custom" Namespace="myControls" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<%@ Import Namespace="System.Web.Configuration" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    /// <summary>

    /// Validation function that is called on both the client and server

    /// </summary>

    protected void AjaxValidator1_ServerValidate(object source, ServerValidateEventArgs args)

    {

        if (UserNameExists(args.Value))

            args.IsValid = false;

        else

            args.IsValid = true;

    }

 

    /// <summary>

    /// Returns true when user name already exists

    /// in Users database table

    /// </summary>

    private bool UserNameExists(string userName)

    {

        string conString = WebConfigurationManager.ConnectionStrings["UsersDB"].ConnectionString;

        SqlConnection con = new SqlConnection(conString);

        SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM Users WHERE UserName=@UserName", con);

        cmd.Parameters.AddWithValue("@UserName", userName);

        bool result = false;

        using (con)

        {

            con.Open();

            int count = (int)cmd.ExecuteScalar();

            if (count > 0)

                result = true;

        }

        return result;

    }

    /// <summary>

    /// Insert new user name to Users database table

    /// </summary>

    protected void btnSubmit_Click(object sender, EventArgs e)

    {

        string conString = WebConfigurationManager.ConnectionStrings["UsersDB"].ConnectionString;

        SqlConnection con = new SqlConnection(conString);

        SqlCommand cmd = new SqlCommand("INSERT Users (UserName,FavoriteColor) VALUES

* (@UserName,@FavoriteColor)", con);

        cmd.Parameters.AddWithValue("@UserName", txtUserName.Text);

        cmd.Parameters.AddWithValue("@FavoriteColor", txtFavoriteColor.Text);

        using (con)

       {

            con.Open();

            cmd.ExecuteNonQuery();

        }

        txtUserName.Text = String.Empty;

        txtFavoriteColor.Text = String.Empty;

    }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Show AjaxValidator</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

 

    <asp:Label

        id="lblUserName"

        Text="User Name:"

        AssociatedControlID="txtUserName"

        Runat="server" />

    <asp:TextBox

        id="txtUserName"

        Runat="server" />

    <custom:AjaxValidator

        id="AjaxValidator1"

        ControlToValidate="txtUserName"

        Text="User name already taken!"

        OnServerValidate="AjaxValidator1_ServerValidate"

        Runat="server" />

 

    <br /><br />

    <asp:Label

        id="lblFavoriteColor"

        Text="Favorite Color:"

        AssociatedControlID="txtFavoriteColor"

        Runat="server" />

    <asp:TextBox

        id="txtFavoriteColor"

        Runat="server" />

    <br /><br />

    <asp:Button

        id="btnSubmit"

        Text="Submit"

        Runat="server" OnClick="btnSubmit_Click" />

 

    </div>

    </form>

</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值