65.9K
CodeProject 正在变化。 阅读更多。
Home

列表验证器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (9投票s)

2005年4月12日

MIT
viewsIcon

92771

验证 ListControl,确保至少选中一个 RadioButton 或 CheckBox。

目标

本文有两个目标。

  1. 实现一个良好的 ListValidator,以验证 CheckBoxListRadioButtonList 中是否至少选中了一项。
  2. 演示一个功能齐全的验证器。

常见的遗漏/问题

许多验证器似乎在某个方面存在缺陷。此控件旨在演示一个完整的验证器应该是什么样子。由于这是我的第一篇文章,我肯定会遗漏一些内容或很多内容。请告诉我,我会尽力保持更新。以下是一些常见问题。我的示例展示了如何实现这些功能。

  • 未实现客户端脚本的验证器。
  • 未实现 EnableClientScirpt="false" 的验证器。
  • 客户端脚本无法与页面上的多个验证器一起工作的验证器。

这是代码

/*

Author:        Murray Roke
Email:        murray@roke.co.nz

Features
 - ClientScript        works.
 - EnableClientScript    works.
 - Multiple Validators    works.

Change Log:
2006-02-17
Implemented fix for javascript validation 
of radio buttons.. Thanks to JCollum from TheCodeProject 

*/
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CompanyName.Web.Controls.Validators
{
    /// <summary>
    /// Validates if at least one item in a ListControl is checked.
    /// </summary>
    /// <remarks>
    /// Original javascript code came from this example, but 
    /// I've improved upon it. 
    /// to get multiple validators on a page working correctly.
    /// http://www.dotnetjunkies.com/
    /// Article/ECCCD6A6-B312-41CB-87A1-10BB5D641D20.dcik
    /// </remarks>
    [DefaultProperty("ErrorMessage")] // make the error message the default 
                                      // property to edit at design time 
                                      // for those using gui editor
    public class ListControlRequiredFieldValidator : BaseValidator 
    {
        /// <summary>
        /// Validator Requirement
        /// </summary>

        /// <returns>True if dependencies are valid.</returns>
        protected override bool ControlPropertiesValid()
        {
            Control controlToValidate = 
                FindControl(ControlToValidate) as ListControl;
            return (controlToValidate != null);
        }

        /// <summary>
        /// Validator Requirement
        /// </summary>
        /// <returns>true if ControlToValidate 
        /// has one item or more selected</returns>

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

        /// <summary>
        /// Return true if an item in the list is selected.
        /// </summary>
        /// <returns>true if ControlToValidate 
        ///      has one item or more selected</returns>
        protected bool EvaluateIsChecked() 
        {
            ListControl listToValidate = 
                ((ListControl) this.FindControl(this.ControlToValidate));

            foreach( ListItem li in listToValidate.Items ) 
            {
                if ( li.Selected == true ) 
                    return true;
            }
            return false;
        }

        /// <summary>

        /// Pre Render
        /// </summary>
        /// <param name="e"></param >
        protected override void OnPreRender( EventArgs e )
        {
            System.Web.HttpContext.Current.Trace.Write(
                                         "Override OnPreRender");
            if(this.DetermineRenderUplevel() && this.EnableClientScript)
            {
                Page.ClientScript.RegisterExpandoAttribute(this.ClientID, 
                    "evaluationfunction", "ListItemVerify");
                Page.ClientScript.RegisterExpandoAttribute(this.ClientID, 
                    "minimumNumberOfSelectedCheckBoxes", "1"); 
                    //TODO: imporove to allow variable number.
                this.RegisterClientScript();
            }
            else
            {
                this.Attributes.Remove("evaluationfunction");
            }
            base.OnPreRender( e );
        }

        /// <summary>
        /// Register the client script.
        /// </summary>

        protected void RegisterClientScript() 
        {
            string script = @"

            <script language=""javascript"">
            function ListItemVerify(val) 
            {
                var control = 
                    document.getElementById(val.controltovalidate);
                var minimumNumberOfSelectedCheckBoxes = 
                    parseInt(val.minimumNumberOfSelectedCheckBoxes);
                var selectedItemCount = 0;
                var liIndex = 0;
                var currentListItem = 
                    document.getElementById(control.id + 
                    '_' + liIndex.toString());
                while (currentListItem != null)
                {
                    if (currentListItem.checked) selectedItemCount++;
                    liIndex++;
                    currentListItem = 
                        document.getElementById(control.id + 
                        '_' + liIndex.toString());
                }
                return selectedItemCount >= 
                    minimumNumberOfSelectedCheckBoxes;
            }
            </script>
            ";

            this.Page.ClientScript.RegisterClientScriptBlock(
                typeof(ListControlRequiredFieldValidator), 
                "ListRequiredValidator_Script",script);
        }
    }
}

Example usage

注册库。

<%@ Register TagPrefix="CompanyName" 
    NameSpace="CompanyName.Web.Controls.Validators"
    Assembly="CompanyName.Web" %>

创建验证器。假设要验证的 CheckBoxList 称为 MyCheckList

<CompanyName:ListControlRequiredFieldValidator
    ControlToValidate="MyCheckList" 
    display="Dynamic" 
    ErrorMessage="Select at least one item" 
    EnableClientScript="true" 
    runat="Server">
    Tick at least one box
</CompanyName:ListControlRequiredFieldValidator>

历史

  • 2005年4月12日 -- 发布原始版本
  • 2006年2月17日 -- 更新
  • 2007年7月24日 -- 更新
© . All rights reserved.