您的位置:首页 > 编程语言 > ASP

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

2009-11-30 11:13 579 查看
学习如何创建自定义验证控件。我们将创建两个自定义控件,首先创建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>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐