By default, ASP.NET will render a CheckBox or a CheckBoxList with an auto generated unique name attribute. This becomes a problem when you want to validate the group, since you can’t set a common name attribute for all the elements.
Here is an example of the HTML that would be rendered by a CheckBoxList with a layout of “Flow”.
----------------------------------------------------------------------------------
My solution to the problem required a custom validator and a custom error Placement function, for the jQuery validaiton plug-in.
First, I added a custom validator that looked at a group of check boxes that are inside a wrapping “Parent()” element. I then count the number of checked check boxes to make sure the limit required (e.g. Must check at least 3 check boxes) is greater than the minimum we set.
-------------------------------------------------------------------------------------
In order to hookup this custom event to all the controls inside of a wrapping “Parent()” control, we use jQuery’s $().each function to call the validator’s rules() function.
----------------------------------------------------------------------------------
Second, our plug-in will by default put an error message next to the control(s) that triggered the error. I over ride the default behavior, we setup a “errorPlacement” function to put one error beside the wrapping “Parent()” control.
Here is what the form looks like when you have a error with your check boxes.

Here is source code used to create the example above.
Here is an example of the HTML that would be rendered by a CheckBoxList with a layout of “Flow”.
----------------------------------------------------------------------------------
<span id="CheckBoxGroup"> <input id="cbk1" name="cbk1" type="checkbox">Check Box 1</input> |
<input id="cbk2" name="cbk2" type="checkbox">Check Box 2</input> |
<input id="cbk3" name="cbk3" type="checkbox">Check Box 3</input> |
</span> |
<span class="jQueryValError"></span> ---------------------------------------------------------------------------------My solution to the problem required a custom validator and a custom error Placement function, for the jQuery validaiton plug-in.
First, I added a custom validator that looked at a group of check boxes that are inside a wrapping “Parent()” element. I then count the number of checked check boxes to make sure the limit required (e.g. Must check at least 3 check boxes) is greater than the minimum we set.
jQuery.validator.addMethod("minChecked", |
function(value, element, param) { |
var $p = $(element).parent(); |
var selected = $p.children('input[type=checkbox]:checked').length; |
if (selected >= param) { |
$p.children().removeClass('error'); |
$p.siblings('.error').remove(); |
return true; |
} |
$p.children('input[type=checkbox]').addClass('error'); | |
In order to hookup this custom event to all the controls inside of a wrapping “Parent()” control, we use jQuery’s $().each function to call the validator’s rules() function.
$(".checkBoxGroup").children('input[type=checkbox]').each(function(){ $(this).rules("add", { minChecked: 3}); }); |
Second, our plug-in will by default put an error message next to the control(s) that triggered the error. I over ride the default behavior, we setup a “errorPlacement” function to put one error beside the wrapping “Parent()” control.
---------------------------------------------------------------------------------
--------------------------------------------------------------------------------$("#<%= form1.ClientID %>").validate({ |
errorPlacement: function(error, element){ |
if(element.rules().minChecked > 0) { |
var $p = $(element).parent(); |
if($p.siblings().hasClass("error") == false) { |
error.insertAfter($p); |
} |
} |
else { |
error.insertAfter(element); |
} |
} |
}); | |
Here is what the form looks like when you have a error with your check boxes.
Here is source code used to create the example above.
<html xmlns="http://www.w3.org/1999/xhtml"> |
<head runat="server"> |
<title>Contact Form Demo</title> |
<script src="styles/jQuery.js" type="text/javascript"></script> |
<script src="styles/jQuery.Validate.js" type="text/javascript"></script> |
<script src="styles/jQuery.Validate.AddOns.js" type="text/javascript"></script> |
<script type="text/javascript"> |
jQuery.validator.addMethod("minChecked", |
function(value, element, param) { |
var $p = $(element).parent(); |
var selected = $p.children('input[type=checkbox]:checked').length; |
if (selected >= param) { |
$p.children().removeClass('error'); |
$p.siblings('.error').remove(); |
return true; |
} |
$p.children('input[type=checkbox]').addClass('error'); |
return false;}, jQuery.validator.format("Please check at least {0} items.")); |
$(document).ready(function(){ |
$("#<%= form1.ClientID %>").validate({ |
rules: { |
<%= FirstName.UniqueID %>: { required: true }, |
<%= LastName.UniqueID %>: { required: true }, |
<%= Email.UniqueID %>: { required: true, email: true }, |
<%= Phone.UniqueID %>: { required: true, phoneUS: true } |
}, |
errorPlacement: function(error, element){ |
if(element.rules().minChecked > 0) { |
var $p = $(element).parent(); |
if($p.siblings().hasClass("error") == false) { |
error.insertAfter($p); |
} |
} |
else { |
error.insertAfter(element); |
} |
} |
}); |
$(".checkBoxGroup").children('input[type=checkbox]').each(function(){ $(this).rules("add", { minChecked: 3}); }); |
$(".myGroupRandom").children('input[type=checkbox]').each(function(){ $(this).rules("add", { minChecked: 1}); }); |
}); |
</script> |
</head> |
<body> |
<form id="form1" runat="server"> |
<div> |
<fieldset> |
<ol> |
<li> |
<label class="left"> |
First Name |
</label> |
<input type="text" id="FirstName" runat="server" /></li> |
<li> |
<label class="left"> |
Last Name |
</label> |
<input type="text" id="LastName" runat="server" /></li> |
<li> |
<label class="left"> |
Email |
</label> |
<input type="text" id="Email" runat="server" /></li> |
<li> |
<label class="left"> |
Phone |
</label> |
<input type="text" id="Phone" runat="server" /></li> |
<li> |
<label class="left"> |
Contact Method |
</label> |
<span class="checkBoxGroup"> |
<input type="checkbox" id="ReqEmail" runat="server" /><label>Email</label> |
<input type="checkbox" id="ReqMail" runat="server" /><label>Mail</label> |
<input type="checkbox" id="ReqPhone" runat="server" /><label>Phone</label> |
<input type="checkbox" id="ReqNoContact" runat="server" /><label>No Contact</label> |
</span></li> |
<li> |
<label class="left"> |
New Letter Type |
</label> |
<span class="myGroupRandom" > |
<input type="checkbox" id="Checkbox1" runat="server" /><label>Company News</label> |
<input type="checkbox" id="Checkbox2" runat="server" /><label>Press Releases</label> |
<input type="checkbox" id="Checkbox3" runat="server" /><label>Deals</label> |
<input type="checkbox" id="Checkbox4" runat="server" /><label>Employement</label> |
</span></li> |
<li> |
<input type="submit" id="Submit" value="Submit" /></li> |
</ol> |
</fieldset> |
</div> |
</form> |
</body> |
</html> ------------------------------------------------------------------------------------
No comments:
Post a Comment