在上一篇文章中我们讲解了有关实现验证控件的一些知识那些内容将为开发人员实现验证控件奠定一定基础为了帮助读者更好的理解验证控件的实现方法本文将首先介绍常见验证控件的实现步骤然后通过一个典型示例说明验证控件的实现方法
验证控件实现步骤
在创建验证控件过程中需要实现服务器端验证和客户端验证等核心内容下面列举了验证控件的常见实现步骤
()验证控件类应由BaseValidator基类继承这样可使验证控件自动继承参与验证框架所需要的功能例如通过继承BaseValidator的ControlToValidate属性实现验证控件与验证目标控件的关联
()实现验证控件所特有的一些属性开发人员可根据应用需求从方便实用的角度出发定义这些特有属性
()重写AddAttributesToRender方法将特有属性及相关内容添加到控件呈现中当实现客户端验证代码时可能需要引用相关呈现内容
()重写EvaluateIsValid方法为验证控件添加服务器端验证逻辑
()重写PreRender事件的事件处理方法OnPreRender除调用基类实现方法外还要实现对客户端验证脚本文件的注册
()编写与验证控件一起打包的客户端验证脚本文件并且将其放置到正确的目录中
通过以上的一个或者几个步骤开发人员就可以实现一个基本的验证控件在实现过程中服务器端验证逻辑和客户端验证逻辑必须保持一致否则即使输入数据通过了客户端验证也无法通过服务器端验证下面将通过一个典型实例来进一步说明验证控件的实现方法以加深读者的理解
典型应用
本节将使用上文所介绍的开发验证控件的方法创建一个名为TelNumValidator的验证控件该控件用于验证用户输入的电话号码是否符合规则如果不符合规则那么动态提示错误信息其效果如图
图 效果图(输入错误状态下)
如图所示页面中主要包括了一个TextBox文本框和一个提交按钮用户必须输入正确格式的电话号码才能够通过验证图中由于没有输入正确的电话号码当单击提交按钮时则无法实现提交页面同时页面还分红蓝两种颜色给出了提示信息下文详细讲解了验证控件的实现过程
首先在实现TelNumValidator控件之前必须进一步明确验证条件
对于国内电话号码一般为两种模式一种是区号为位电话号码为位另一种是区号为位电话号码为位据此可得出用于验证的正则表达式\d{}\d{}|\d{}\d{}无论是服务器端验证逻辑还是客户端验证逻辑都必须遵从以上验证条件只有符合这两种模式的输入数据才能够通过验证
下面列出了验证控件TelNumValidator的服务器端验证的源代码
using System;
using SystemCollectionsGeneric;
using SystemComponentModel;
using SystemText;
using SystemWeb;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemTextRegularExpressions;
namespace WebControlLibrary
{
[DefaultProperty(Text)]
[ToolboxData(<{}:TelNumValidator runat=server>
</{}:TelNumValidator>)
]
public class TelNumValidator : BaseValidator
{
// 定义私有变量其中_clientFileUrl表示JavaScript文件存储目录
// ValidationExpression表示正则表达式
private string _clientFileUrl = ClientFiles/;
private const string ValidationExpression = @(\d{}\d{}|\d{}\d{});
// 定义属性ClientFileUrl用于获取或设置脚本相对路径
[
Description(获取或设置脚本相对路径)
DefaultValue(ClientFiles/)
Category(Appearance)
]
public string ClientFileUrl
{
get
{ return _clientFileUrl; }
set
{ _clientFileUrl = value; }
}
//重写AddAttributesToRender为验证控件添加特殊属性evaluationfunction和validationexp
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
baseAddAttributesToRender(writer);
if (RenderUplevel)
{
writerAddAttribute(evaluationfunction TelNumValidatorEvaluateIsValid false);
writerAddAttribute(validationexp ValidationExpression);
}
}
//重写EvaluateIsValid方法定义服务器端验证逻辑
protected override bool EvaluateIsValid()
string controlValue = GetControlValidationValue(ControlToValidate);
if (controlValue == null)
{
return true;
}
controlValue = controlValueTrim();
try
{
Match m = RegexMatch(controlValue ValidationExpression);
return (mSuccess && (mIndex == ) && (mLength == controlValueLength));
}
catch
{
return false;
}
}
//重写OnPreRender方法注册客户端脚本程序
protected override void OnPreRender(EventArgs e)
{
baseOnPreRender(e);
if (RenderUplevel)
{PageClientScriptReGISterClientScriptBlock ( typeof(TelNumValidator)
ClientValidator GetClientFileUrl ( ClientValidatorjs ));
}
}
// 实现辅助函数GetClientFileUrl用于获取JavaScript文件的完整路径
private string GetClientFileUrl(string fileName)
{
string tempClient = StringFormat(<script language=\javascript\ src=\{}\></script> (ClientFileUrl + fileName));
return tempClient;
}
}