列表验证器






4.40/5 (9投票s)
验证 ListControl,确保至少选中一个 RadioButton 或 CheckBox。
目标
本文有两个目标。
- 实现一个良好的 ListValidator,以验证
CheckBoxList
或RadioButtonList
中是否至少选中了一项。 - 演示一个功能齐全的验证器。
常见的遗漏/问题
许多验证器似乎在某个方面存在缺陷。此控件旨在演示一个完整的验证器应该是什么样子。由于这是我的第一篇文章,我肯定会遗漏一些内容或很多内容。请告诉我,我会尽力保持更新。以下是一些常见问题。我的示例展示了如何实现这些功能。
- 未实现客户端脚本的验证器。
- 未实现
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日 -- 更新