۱۳۸۸/۰۵/۱۹

تعيين اعتبار يك checkBoxList با كمك jQuery


checkBoxList جزو كنترل‌هايي در ASP.Net است كه نمي‌توان RequiredFieldValidator استاندارد را بر آن اعمال كرد. به عبارتي اگر نياز بود حداقل يك آيتم چك باكس ليست حتما توسط كاربر انتخاب شود، راه حل آماده‌اي براي آن وجود ندارد. پياده سازي اين‌كار با استفاده از jQuery به سادگي ميسر است كه در ادامه آن‌را مرور خواهيم كرد.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="CheckBoxListValidator._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function CheckItems(sender, args) {
//Get the total nuumber of selected CheckBoxes
var num = jQuery("table#<%=CheckBoxList1.ClientID%> input:checked").length;
args.IsValid = num > 0;
}
//]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:CheckBoxList ID="CheckBoxList1" runat="server">
<asp:ListItem>item1</asp:ListItem>
<asp:ListItem>item2</asp:ListItem>
</asp:CheckBoxList>
<asp:CustomValidator ClientValidationFunction="CheckItems" ID="ValidateIt"
runat="server" ErrorMessage="(*)"> </asp:CustomValidator>
<asp:Button ID="Button1" runat="server" />
</div>
</form>
</body>
</html>

توضيحات:
يك CustomValidator استاندارد را به فرم اضافه كرده‌ايم تا توسط تابعي كه به ClientValidationFunction آن معرفي مي‌شود، كار اعتبار سنجي سمت كاربر را انجام دهد. اين تابع يا همان CheckItems مثال فوق، امضاي استاندارد و آشنايي دارد. اگر تعيين اعتبار صورت گرفته باشد، بايد args.IsValid در آن به true تنظيم شود يا بر عكس.
اصل قضيه هم، همين يك سطر كد زير است:

var num = jQuery("table#<%=CheckBoxList1.ClientID%> input:checked").length;
كار اين سطر كه از جي‌كوئري استفاده مي‌كند، پيدا كردن جدولي است كه ID آن مساوي آي دي سمت كلاينت چك باكس ليست ما است (ASP.Net يك چك باكس ليست را به صورت يك جدول حاوي چك باكس‌ها رندر مي‌كند). سپس در همان ناحيه مشغول به جستجوي چك باكس‌هايي مي‌شود كه تيك خورده‌اند. نهايتا تعداد آن‌ها را بر مي‌گرداند.