日期:2010-10-29  浏览次数:20460 次

  在上一篇文章中,我们讲解了有关实现验证控件的一些知识。那些内容将为开发人员实现验证控件奠定一定基础。为了帮助读者更好的理解验证控件的实现方法,本文将首先介绍常见验证控件的实现步骤,然后,通过一个典型示例说明验证控件的实现方法。

  1. 验证控件实现步骤

  在创建验证控件过程中,需要实现服务器端验证和客户端验证等核心内容。下面列举了验证控件的常见实现步骤。

  (1)验证控件类应由BaseValidator基类继承。这样可使验证控件自动继承参与验证框架所需要的功能。例如,通过继承BaseValidator的ControlToValidate属性,实现验证控件与验证目标控件的关联。

  (2)实现验证控件所特有的一些属性。开发人员可根据应用需求,从方便实用的角度出发定义这些特有属性。

  (3)重写AddAttributesToRender方法,将特有属性及相关内容添加到控件呈现中。当实现客户端验证代码时可能需要引用相关呈现内容。

  (4)重写EvaluateIsValid方法,为验证控件添加服务器端验证逻辑。

  (5)重写PreRender事件的事件处理方法OnPreRender,除调用基类实现方法外,还要实现对客户端验证脚本文件的注册。

  (6)编写与验证控件一起打包的客户端验证脚本文件,并且将其放置到正确的目录中。

  通过以上的一个或者几个步骤,开发人员就可以实现一个基本的验证控件。在实现过程中,服务器端验证逻辑和客户端验证逻辑必须保持一致,否则,即使输入数据通过了客户端验证,也无法通过服务器端验证。下面将通过一个典型实例来进一步说明验证控件的实现方法,以加深读者的理解。

  2、典型应用

  本节将使用上文所介绍的开发验证控件的方法,创建一个名为TelNumValidator的验证控件。该控件用于验证用户输入的电话号码是否符合规则。如果不符合规则,那么动态提示错误信息。其效果如图1。


图1 效果图(输入错误状态下)


  如图1所示,页面中主要包括了一个TextBox文本框和一个提交按钮。用户必须输入正确格式的电话号码,才能够通过验证。图1中,由于没有输入正确的电话号码,当单击提交按钮时,则无法实现提交页面。同时,页面还分红蓝两种颜色给出了提示信息。下文详细讲解了验证控件的实现过程。

  首先,在实现TelNumValidator控件之前,必须进一步明确验证条件。

  对于国内电话号码,一般为两种模式:一种是区号为3位,电话号码为8位,另一种是区号为4位,电话号码为7位。据此,可得出用于验证的正则表达式:“\d{3}-\d{8}|\d{4}-\d{7}”。无论是服务器端验证逻辑,还是客户端验证逻辑,都必须遵从以上验证条件。只有符合这两种模式的输入数据才能够通过验证。

  下面列出了验证控件TelNumValidator的服务器端验证的源代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text.RegularExpressions;

namespace WebControlLibrary
{
 [DefaultProperty("Text")]
 [ToolboxData("<{0}:TelNumValidator runat=server>
  </{0}:TelNumValidator>")
 ]

 public class TelNumValidator : BaseValidator
 {
  // 定义私有变量,其中_clientFileUrl表示JavaScript文件存储目录
  // ValidationExpression表示正则表达式

  private string _clientFileUrl = "ClientFiles/";
  private const string ValidationExpression = @"(\d{3}-\d{8}|\d{4}-\d{7})";
  // 定义属性ClientFileUrl,用于获取或设置脚本相对路径
  [
   Description("获取或设置脚本相对路径"),
   DefaultValue("ClientFiles/"),
   Category("Appearance")
  ]

  public string ClientFileUrl
  {
   get
   { return _clientFileUrl; }
   set 
   { _clientFileUrl = value; }
  }
  //重写AddAttributesToRender,为验证控件添加特殊属性evaluationfunction和validationexp
  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.ClientScript.RegisterClientScriptBlock ( typeof(TelNumValidator),
    "ClientValidator", GetClientFileUrl ( "ClientValidator.js" ));
  }
 }

 // 实现辅助函数GetClientFileUrl,用于获取JavaScript文件的完整