Search code examples
jqueryasp.netwizardrequiredfieldvalidator

Enable/Disable asp:validators using jquery


I am working with a wizard, where the user can sign up. There is a asp:RadioButtonList with two options, and some of the input fields in the wizard changes when the radiobutton changes. On each field there is some asp:Validators (asp:RequiredFieldValidator for example). The problem is, that when the user submits the page, the validator for the hidden textbox is still popping up.

First, here is the div tags which changes the shown textboxes and the RadioButtonList

<div id="divTxt1">
  <asp:TextBox runat="server" CssClass="text" ID="txtNumber"
       type="number"/>
  <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
       runat="server" ControlToValidate="txtNumber" EnableClientScript="true" ErrorMessage="Error" ToolTip="Error">*
   </asp:RequiredFieldValidator>
</div>
<div id="divTxt2">
  <asp:TextBox runat="server" CssClass="text" ID="txtNumber2"
       type="number"/>
  <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
       runat="server" ControlToValidate="txtNumber2" EnableClientScript="true" ErrorMessage="Error2" ToolTip="Error2">*
   </asp:RequiredFieldValidator>
</div>
<div id="radio">
<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal">
   <asp:ListItem Value="1" Selected="True">Privat</asp:ListItem>
   <asp:ListItem Value="2">Offentlig</asp:ListItem>
   </asp:RadioButtonList>
</div>

I have tried to solve it using JQuery like the following, which I have read should do the trick, but unfortunately it doesn't:

$(document).ready(function () {

    $('#<%= WizardStep1.ContentTemplateContainer.FindControl("RadioButtonList1").ClientID %> input').change(function () {
        if ($(this).val() == "1") {
            $('#txtNumber').toggle('fast');
            $('#txtNumber2').toggle('fast');     
            ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], false);
            ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], true);
        }

        if ($(this).val() == "2") {
            $('#txtNumber').toggle('fast');
            $('#txtNumber2').toggle('fast');
            ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], false);
            ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], true);
        }
    });
});

So, any ideas what's wrong?


Solution

  • The client side API for validators is here.

    Something you may be able to adapt to your needs (this will disable all the validators via client script):

    if (Page_Validators) {
        PageValidators.forEach(function(pageValidator) {
            if (pageValidator == null) {return;}
            vldGrp = pageValidator.validationGroup;
            ValidatorEnable(pageValidator, false);
        });
    };
    

    So you could add a if block to check the validator name, or more so the .controlToValidate which returns the target ID of the validator - then disable it:

    if (Page_Validators) {
        PageValidators.forEach(function(pageValidator) {
            if (pageValidator == null) {return;}
            if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
                return;
            }
            ValidatorEnable(pageValidator, false);
        });
    };
    

    You should also probably add a break in the loop if it's right one, if you don't need to check any further validators. You can use .some instead of .forEach to break early:

    if (Page_Validators) {
        PageValidators.some(function(pageValidator) {
            if (pageValidator == null) {return false;}
            if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
                return false;
            }
            ValidatorEnable(pageValidator, false);
            return true;
        });
    };
    

    You can encapsulate this into a function:

    var validatorState = function(element, isEnabled) {
        if (Page_Validators) {
            PageValidators.some(function(pageValidator) {
                if (pageValidator == null) {return false;}
                if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
                    return false;
                }
                ValidatorEnable(pageValidator, false);
                return true;
            });
        };
    };
    

    and use:

    validatorState('txtCancellationReson', true);
    

    or

    validatorState($('#txtCancellationReson').attr('id'), true);