具有复选框验证功能的Asp.net webform无效

时间:2018-06-14 06:15:26

标签: javascript asp.net validation webforms asp.net-validators

我有一个带有5-6个输入字段的webform,并且验证工作正常。现在我需要为T& C添加checkboc,除非检查T& C复选框,否则表单不应提交。

为了简单起见,我的部分代码中删除了一些输入以保持简洁。

我正在使用OnClientClick="ClientSideClick(this)"函数检查验证以禁用多次提交的提交按钮。

此表单适用于&如果我不检查复选框验证,但是当我尝试验证并且'Page_ClientValidate'为真时,它永远不会检查代码的一部分是否有复选框验证。我尝试将代码放在不同的地方,但它确实有效。不是我做错了什么

<asp:Label ID="lblFirstName" runat="server" CssClass="row-label" Text="First Name:"></asp:Label>
<asp:TextBox ID="txtFirstName" runat="server" CssClass="row-input"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfFN" runat="server" ValidationGroup="VG" ErrorMessage="*"  ControlToValidate="txtFirstName" Display="Dynamic"></asp:RequiredFieldValidator>

<asp:Label ID="Label2" runat="server" CssClass="row-label" Text="Last Name:"></asp:Label>
<asp:TextBox ID="txtLastName" runat="server" CssClass="row-input"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvtxtLastName" runat="server" ValidationGroup="VG" ErrorMessage="*" ControlToValidate="txtLastName" Display="Dynamic"></asp:RequiredFieldValidator>

<asp:Label ID="lblEmail" runat="server" CssClass="row-label" Text="E-mail:"></asp:Label>
<asp:TextBox ID="txtEmail" runat="server" CssClass="row-input"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfvEmail" runat="server" ValidationGroup="VG" ErrorMessage="*"  ControlToValidate="txtEmail" Display="Dynamic"></asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="revEmail" runat="server" ErrorMessage="*"  ControlToValidate="txtEmail" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" ValidationGroup="VG" Display="Dynamic"></asp:RegularExpressionValidator>

<asp:CheckBox ID="chkIAgreeSub" runat="server"  /> I agree to Terms & condition

<asp:Button ID="btnSave" runat="server" CssClass="btn btn-submit" Text="Submit" OnClick="btnSave_Click" OnClientClick="ClientSideClick(this)" UseSubmitBehavior="False" ValidationGroup="VG" />

<script type="text/javascript">
        //Avoid Multiple Submission
        function ClientSideClick(myButton) {
            // Client side validation
            if (typeof (Page_ClientValidate) == 'function') {

               if (Page_ClientValidate() == false)
               {
                  console.log("VALIDATION FALSE");
                  return false;
               }
               else
               {
               console.log("VALIDATION TRUE");
                    if (document.getElementById("<%=chkboxTC.ClientID %>").checked == true) {
                        console.log("T&C  checked TRUE");
                        return true;
                    } else {
                        console.log("T&C NOT  checked FALSE");
                        return false;
                    }
               }


            }

            if (myButton.getAttribute('type') == 'button') {
                // diable the button
                myButton.disabled = true;
                myButton.value = "Processing...";
            }
            return true;

        }

 </script>      

1 个答案:

答案 0 :(得分:2)

您的代码无效,因为asp:CheckBox呈现为

<label id="the_long_webforms_id">
    <input type="checkbox"/>
    I agree to Terms & condition
</label>

所以行

document.getElementById("<%=chkboxTC.ClientID %>").checked

失败。你需要像

这样的东西
// provided a class from the checkbox from preventing using the client id
// then took the child that is input:checkbox of the label
e.IsValid = document.querySelector('.agree-terms input').checked;

更简单的方法是使用此

<asp:CheckBox ID="chkIAgreeSub" runat="server"
    CssClass="agree-terms"
    Text="I agree to Terms & condition">
</asp:CheckBox>
<asp:CustomValidator ID="CheckBoxRequired" runat="server" 
    EnableClientScript="true"
    ErrorMessage="You must select this box to proceed"
    ValidationGroup="VG"
    ClientValidationFunction="CheckBoxRequired_ClientValidate">
</asp:CustomValidator>

的JavaScript

function CheckBoxRequired_ClientValidate(sender, e)
{
    e.IsValid = document.querySelector('.agree-terms input').checked;
    //e.IsValid = jQuery(".agree-terms input:checkbox").is(':checked');
}