在.Net中创建自定义验证控件

简单记录一下:

自定义验证控件主要是继承自BaseValidator(该类实现了IValidator),我们只需要按照自己的规则实现EvaluateIsValid()方法即可。

如果要想在客户端验证的话,可以重写OnPreRender方法。

常用属性和方法介绍:

  • ControlToValidate:要验证的控件的ID
  • FindControl(string id):根据传递的Id获得控件(Control)
  • GetControlValidationValue(string name):根据name获得控件的值value
  • 别的属性可以自己在类里追加

相关的命名空间如下:

using System.Web.UI;
using System.Web.UI.WebControls;

废话不多说,直接上代码:

public class ListValidator : BaseValidator
    {
        protected override bool ControlPropertiesValid()
        {
            Control ctrl = FindControl(ControlToValidate) as ListControl;
            return (ctrl != null);
        }

        protected override bool EvaluateIsValid()
        {
            return this.CheckIfItemIsChecked();
        }

        protected bool CheckIfItemIsChecked()
        {
            ListControl listItemValidate = FindControl(ControlToValidate) as ListControl;
            foreach (ListItem item in listItemValidate.Items)
            {
                if (item.Selected)
                    return true;
            }
            return false;
        }

        ///client validate
        ///
        protected override void OnPreRender(EventArgs e)
        {
            //this.RenderUplevel
            if (this.DetermineRenderUplevel() && this.EnableClientScript)
            {
                Page.ClientScript.RegisterExpandoAttribute(this.ClientID, "evaluationfunction", "CheckIfListChecked");
                this.CreateJavaScript();
            }
            base.OnPreRender(e);
        }
        /// <summary>
        /// 生成客户端js验证code
        /// </summary>
        protected void CreateJavaScript()
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append(@"<script type=""text/javascript"">function CheckIfListChecked(ctrl){");
            sb.Append(@"var chkBoxList = document.getElementById(document.getElementById(ctrl.id).controltovalidate);");
            sb.Append(@"var chkBoxCount= chkBoxList.getElementsByTagName(""input"");");
            sb.Append(@"for(var i=0;i<chkBoxCount.length;i++){");
            sb.Append(@"if(chkBoxCount.item(i).checked){");
            sb.Append(@"return true; }");
            sb.Append(@"}return false; ");
            sb.Append(@"}</script>");
            if (!Page.ClientScript.IsClientScriptBlockRegistered("JSScript"))
            {
                Page.ClientScript.RegisterClientScriptBlock(GetType(), "JSScript", sb.ToString());
            }
        }
    }

查看调用页的源代码之后,会发现自动生成了一些script片段,这些就是用来做验证的,代码不做解释,因为都是遵循ECMAScript Language Specification。

E文地址:文字简单,不翻译了

http://www.dotnetcurry.com/ShowArticle.aspx?ID=197

详细介绍:

http://www.cnblogs.com/joeliu/archive/2008/11/13/1240206.html

posted @ 2011-02-28 17:52  李传涛  阅读(280)  评论(0编辑  收藏  举报