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