在.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

你可能感兴趣的:(.net)