如何验证转发器中的所有复选框都已选中
How can I validate that all checkboxes in a repeater are checked
我有一个表单,它从数据库中提取所需的协议文本,并将每个活动的协议条款显示为转发器中的单独复选框。我需要验证在提交表单之前是否选中了转发器中的所有复选框。有没有办法做到这一点,或者我应该用不同于我在下面开始的方式来完成这个?
目前,我有一个 CustomValidator,但它只要求至少选中一个复选框。
<h1>Agreements</h1>
<asp:Repeater ID="rptAgreements" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td valign="top" style="padding:10px;">
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" ClientValidationFunction = "ValidateCheckBox"></asp:CustomValidator>
<asp:CheckBox ID="Agreements" value='<%# Eval("AgreementID") %>' runat="server" ClientIDMode="Static" />
</td>
<td style="padding:10px;">
<asp:Label ID="lblAgreementText" runat="server" Text='<%# Eval("AgreementText") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<script type = "text/javascript">
function ValidateCheckBox(sender, args) {
if (document.getElementById("Agreements").checked == true) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}
</script>
隐藏代码:
try
{
using (SqlConnection con = new SqlConnection(FormConnstring))
{
using (SqlCommand cmd = new SqlCommand("sp_SelectAgreements", con))
{
using (SqlDataAdapter agreeDS = new SqlDataAdapter(cmd))
{
cmd.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();
agreeDS.Fill(dt);
rptAgreements.DataSource = dt;
rptAgreements.DataBind();
}
}
}
}
您正在代码中分配 ClientIDMode="Static",这将在 Html 中生成重复的 ID,并且它不是有效的 html。
您可以为您的复选框分配 class,在 JS 中计算协议复选框和选中的复选框,然后您可以比较数字。
比如下面:
<input type="checkbox" class="agreement" value="1"> agreement 1
<input type="checkbox" class="agreement" value="2"> agreement 2
<input type="checkbox" class="agreement" value="3"> agreement 3
<input type="checkbox" class="agreement" value="4"> agreement 4
<input type="submit" value="GO" id="btn" />
$('#btn').click(function(){
var chkAll=$('input.agreement').length;
var chkSelected = $('input.agreement:checked').length;
alert(chkAll==chkSelected);
});
您可以使用 class 并根据您的目的使用单个 customValidator。所以你的代码会像下面这样。
<h1>Agreements</h1>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" ClientValidationFunction = "ValidateCheckBoxes"></asp:CustomValidator>
<asp:Repeater ID="rptAgreements" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td valign="top" style="padding:10px;">
<asp:CheckBox ID="Agreements" value='<%# Eval("AgreementID") %>' runat="server" ClientIDMode="Static" CssClass="Agreement"/>
</td>
<td style="padding:10px;">
<asp:Label ID="lblAgreementText" runat="server" Text='<%# Eval("AgreementText") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<script type = "text/javascript">
function ValidateCheckBoxes(sender, args) {
if ($('input.Agreement').not(':checked').length == 0) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}
我有一个表单,它从数据库中提取所需的协议文本,并将每个活动的协议条款显示为转发器中的单独复选框。我需要验证在提交表单之前是否选中了转发器中的所有复选框。有没有办法做到这一点,或者我应该用不同于我在下面开始的方式来完成这个?
目前,我有一个 CustomValidator,但它只要求至少选中一个复选框。
<h1>Agreements</h1>
<asp:Repeater ID="rptAgreements" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td valign="top" style="padding:10px;">
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" ClientValidationFunction = "ValidateCheckBox"></asp:CustomValidator>
<asp:CheckBox ID="Agreements" value='<%# Eval("AgreementID") %>' runat="server" ClientIDMode="Static" />
</td>
<td style="padding:10px;">
<asp:Label ID="lblAgreementText" runat="server" Text='<%# Eval("AgreementText") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<script type = "text/javascript">
function ValidateCheckBox(sender, args) {
if (document.getElementById("Agreements").checked == true) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}
</script>
隐藏代码:
try
{
using (SqlConnection con = new SqlConnection(FormConnstring))
{
using (SqlCommand cmd = new SqlCommand("sp_SelectAgreements", con))
{
using (SqlDataAdapter agreeDS = new SqlDataAdapter(cmd))
{
cmd.CommandType = CommandType.StoredProcedure;
DataTable dt = new DataTable();
agreeDS.Fill(dt);
rptAgreements.DataSource = dt;
rptAgreements.DataBind();
}
}
}
}
您正在代码中分配 ClientIDMode="Static",这将在 Html 中生成重复的 ID,并且它不是有效的 html。
您可以为您的复选框分配 class,在 JS 中计算协议复选框和选中的复选框,然后您可以比较数字。 比如下面:
<input type="checkbox" class="agreement" value="1"> agreement 1
<input type="checkbox" class="agreement" value="2"> agreement 2
<input type="checkbox" class="agreement" value="3"> agreement 3
<input type="checkbox" class="agreement" value="4"> agreement 4
<input type="submit" value="GO" id="btn" />
$('#btn').click(function(){
var chkAll=$('input.agreement').length;
var chkSelected = $('input.agreement:checked').length;
alert(chkAll==chkSelected);
});
您可以使用 class 并根据您的目的使用单个 customValidator。所以你的代码会像下面这样。
<h1>Agreements</h1>
<asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="*" ClientValidationFunction = "ValidateCheckBoxes"></asp:CustomValidator>
<asp:Repeater ID="rptAgreements" runat="server">
<HeaderTemplate>
<table>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td valign="top" style="padding:10px;">
<asp:CheckBox ID="Agreements" value='<%# Eval("AgreementID") %>' runat="server" ClientIDMode="Static" CssClass="Agreement"/>
</td>
<td style="padding:10px;">
<asp:Label ID="lblAgreementText" runat="server" Text='<%# Eval("AgreementText") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<script type = "text/javascript">
function ValidateCheckBoxes(sender, args) {
if ($('input.Agreement').not(':checked').length == 0) {
args.IsValid = true;
} else {
args.IsValid = false;
}
}