您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



[cc]P104 7.4 实现一个简单的验证控件
狼子 发表于 2007-7-25 23:13:00 阅读全文 | 回复(0) | 引用通告 | 编辑

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下,会出现警告

“System.Web.UI.Page.RegisterClientScriptBlock(string, string)”已过时:“The recommended alternative is ClientScript.RegisterClientScriptBlock(Type type, string key, string script).
http://go.microsoft.com/fwlink/?linkid=14202

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>

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.