【问题标题】:How can I validate that all checkboxes in a repeater are checked如何验证中继器中的所有复选框都已选中
【发布时间】:2018-12-12 09:23:11
【问题描述】:

我有一个表单,它从数据库中提取所需的协议文本,并将每个有效协议条款显示为转发器中的单独复选框。在提交表单之前,我需要验证转发器中的所有复选框都已选中。有没有办法做到这一点,或者我应该以不同于我在下面开始的方式来完成这一点?

目前,我有一个 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();
                }
            }
        }
    }

【问题讨论】:

    标签: c# asp.net validation webforms asprepeater


    【解决方案1】:

    您可以使用一个类并使用单个 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您在代码中分配了 ClientIDMode="Static",这将在 Html 中生成重复的 Id,并且它不是有效的 html。

      您可以为您的复选框分配类,并在 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);
      });
      

      【讨论】:

      • 我添加了以下内容来完成我的验证... if (chkAll != chkSelected) { $('#divAgreements').addClass('notComplete');返回假; } else { $('#divAgreements').removeClass('notComplete');返回真; }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 2022-11-02
      • 2017-06-07
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多