摘要:CustomValidator to CheckBoxList
這次竟然讓我遇到一種狀況是,RequiredFieldValidator及CustomValidator無法指定他的ControlToValidate到CheckBoxList
導致不少人使用CustomerValidator搭配特定的JavaScript,那個JavaScript必須指定Control.ClientID
這相當的不方便。
所以我到處從網路抄抄抄,終於找到一種方法。
就是自訂Control,繼承CheckBoxList,使他可以被指定ControlToValidator
並且在搭配自訂JavaScript,可以達到,可以指定ControlToValidator及無需使用Control.ClientID方式來做!
第一步:繼承並改寫成可Valid的CheckBoxList
namespace Samples.AspNet.CS.Controls
{
[ValidationPropertyAttribute("ValidateableProperty")]
public class ValidateableCheckBoxList : CheckBoxList
{
public string ValidateableProperty
{
get { return (this.Items.Cast<ListItem>().Where(i => i.Selected).Count() > 0) ? "something was selected" : ""; }
}
}
}第二步:註冊控制項
<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls"%>
第三步:頁面撰寫,並撰寫自訂JavaScript,以下是完整程式碼,
可是有一個缺點,竟然使用RequiredFieldValidator 並且ValidationSummary 的ShowMessageBox ="true"會無效。
所以才逼不得以使用CustomValidator 加JavaScript囉!
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestCustomerValidator.aspx.cs" Inherits="Sample_TestCustomerValidator" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>未命名頁面</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<aspSample:ValidateableCheckBoxList ID="ValidateableCheckBoxList1" runat="server" >
<asp:ListItem >Test1</asp:ListItem>
<asp:ListItem >Test2</asp:ListItem>
</aspSample:ValidateableCheckBoxList>
<asp:TextBox ID="TextBox1" runat="server" Text=""></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup ="A" />
<asp:CustomValidator ID="CustomValidator1" runat="server" Display ="None" ValidationGroup ="A" ErrorMessage ="請勾選" ControlToValidate ="ValidateableCheckBoxList1" ClientValidationFunction ="CheckValid"></asp:CustomValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" Display ="None" runat="server" ValidationGroup ="A" ControlToValidate="TextBox1" ErrorMessage="請填寫"></asp:RequiredFieldValidator>
<asp:ValidationSummary ID="ValidationSummary1" ValidationGroup="A" ShowMessageBox ="true" ShowSummary="false" runat="server" />
</div>
<script language='javascript' type='text/javascript'>
function CheckValid(source, args) {
var chkListArea = document.getElementById(source.controltovalidate);
var chkList = chkListArea.getElementsByTagName('input');
for (var i = 0; i < chkList.length; i++) {
if (chkList[i].checked) {
args.IsValid = true;
return;
}
}
args.IsValid = false;
}
</script>
</form>
</body>
</html>