P104 验证控件的通用实现步骤
(1)设置验证控件类由BaseValidator基类继承。这样实现首先可使验证控件自动继承与验证框架所需要的功能,其次可自动引用WebUIValidation.js脚本文件,最后通过继承BaseValidator的ControlToValidate属性,实现验证控件与验证目标控件的关联。
(2)实现验证控件所特有的一些属性。控件开发者可根据应用需求,从方便实用的角度出发定义这些特有属性。
(3)重写AddAttributesToRender方法,将特有属性及相关内容添加到控件呈现中,当实现客户端验证代码时可能需要引用相关呈现内容。
(4)通过重写EvaluateIsValid方法,为验证控件添加服务器端验证逻辑。
(5)重写PreRender事件的事件处理方法OnPreRender,除调用基类实现方法外,还要实现对客户端验证脚本文件的注册。
(6)编写与验证控件一起打包的客户端验证脚本文件,并且将其放置到正确的目录中。
例子的代码:
TelNumValidator.cs
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text.RegularExpressions;
namespace P105_Validator
{
/// <summary>
/// 用于验证国内电话号码的验证控件实现
/// </summary>
[
ToolboxData("<{0}:TelNumValidator runat=server ErrorMessage=TelNumValidatorControl Text=*></{0}:TelNumValidator>")
]
public class TelNumValidator : System.Web.UI.WebControls.BaseValidator
{
private string _clientFileUrl = "ClientFiles/";
private const string ValidationExpression = @"(\d{3}-\d{8}|\d{4}-\d{7})";
[
Description("设置脚本相对路径"),
DefaultValue("ClientFiles/"),
Category("Appearance")
]
public string ClientFileUrl
{
get
{
return _clientFileUrl;
}
set
{
_clientFileUrl = value;
}
}
//重写AddAttributesToRender
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
if (RenderUplevel)
{
writer.AddAttribute("evaluationfunction", "TelNumValidatorEvaluateIsValid", false);
writer.AddAttribute("validationexp", ValidationExpression);
}
}
//重写EvaluateIsValid方法,定义服务器端验证逻辑
protected override bool EvaluateIsValid()
{
string controlValue = GetControlValidationValue(ControlToValidate);
if (controlValue == null)
{
return true;
}
controlValue = controlValue.Trim();
try
{
Match m = Regex.Match(controlValue, ValidationExpression);
return (m.Success && (m.Index == 0) && (m.Length == controlValue.Length));
}
catch
{
return false;
}
}
//重写OnPreRender方法,注册客户端脚本程序
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (RenderUplevel)
{
Page.RegisterClientScriptBlock(typeof(TelNumValidator).FullName, GetClientFileUrl("ClientValidator.js"));
}
}
private string GetClientFileUrl(string fileName)
{
string tempClient = String.Format("<script language=\"javascript\" src=\"{0}\"></script>", (ClientFileUrl + fileName));
return tempClient;
}
}
}
在asp.net2.0下,会出现警告
ClientFiles/ClientValidator.js
function TelNumValidatorEvaluateIsValid(val)
{
var validationexp = val.validationexp;
var valueToValidate = ValidatorTrim(ValidatorGetValue(val.controltovalidate));
var rx = new RegExp(validationexp);
var matches = rx.exec(valueToValidate);
return (matches != null && valueToValidate == matches[0]);
}
测试的文件:P105.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="P105.aspx.vb" Inherits="P105" %>
<%@ Register TagPrefix="tnv" Namespace="P105_Validator" Assembly="P105_Validator" %>
<!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:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<tnv:TelNumValidator runat="server" ID="demo" ControlToValidate="TextBox1" Text="请输入有效的电话号码" ErrorMessage="正确的格式:010-12345678 或者 0123-1234567"></tnv:TelNumValidator>
<asp:Button ID="Button1" runat="server" Text="提交" />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" HeaderText="Error:" />
</div>
</form>
</body>
</html>