List Validator






4.40/5 (9 votes)
Validates a ListControl to ensure at least one RadioButton or CheckBox is checked.
Objective
This article has two goals.
- Implement a good ListValidator to validate whether at least one item in a
CheckBoxList
orRadioButtonList
has been checked. - Demonstrate a fully functional validator.
Common omissions / problems
Many validators seem to fall down in one area or another. This control is an attempt to demonstrate how a complete validator should look. As this is my first article, I'm sure I'll miss something or lots of things. Please let me know and I'll try to keep it up-to-date. Here are a few common problems. My example shows how to implement these features.
- Validators that don't implement client script.
- Validators that don't implement
EnableClientScirpt="false"
. - Validator client scripts that don't work with multiple validators on a page.
Here's the code
/*
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 the library.
<%@ Register TagPrefix="CompanyName"
NameSpace="CompanyName.Web.Controls.Validators"
Assembly="CompanyName.Web" %>
Create the validator. Imagine that the CheckBoxList
you wish to validate is called MyCheckList
.
<CompanyName:ListControlRequiredFieldValidator
ControlToValidate="MyCheckList"
display="Dynamic"
ErrorMessage="Select at least one item"
EnableClientScript="true"
runat="Server">
Tick at least one box
</CompanyName:ListControlRequiredFieldValidator>
History
- 12 April, 2005 -- Original version posted
- 17 February, 2006 -- Updated
- 24 July, 2007 -- Updated