【问题标题】:Enable/Disable asp:validators using jquery使用 jquery 启用/禁用 asp:validators
【发布时间】:2012-03-31 00:50:07
【问题描述】:

我正在使用一个向导,用户可以在其中注册。有一个带有两个选项的 asp:RadioButtonList,并且向导中的某些输入字段会随着单选按钮的变化而变化。在每个字段上都有一些 asp:Validators(例如 asp:RequiredFieldValidator)。问题是,当用户提交页面时,隐藏文本框的验证器仍在弹出。

首先,这里是改变显示文本框和 RadioButtonList 的 div 标签

<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>

我尝试使用 JQuery 来解决它,如下所示,我读过它应该可以解决问题,但不幸的是它没有:

$(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);
        }
    });
});

那么,有什么想法吗?

【问题讨论】:

  • 你确定吗?你能找到控制吗?检查 NULL 吗?
  • 当我在 IE 中调试时,它没有错误地通过 - 但它没有禁用。
  • 没有任何 javascript 错误,'因为如果它不起作用,一定有一个,你不这么认为吗???只需尝试使用萤火虫进行检查。它应该会给你一个提示。
  • 你能分享你的javascript“生成”版本(绑定了id)吗?

标签: jquery asp.net wizard requiredfieldvalidator


【解决方案1】:

【讨论】:

  • 这正是我的问题,但我决定不回答。
  • 来自stackoverflow.com/help/how-to-answer“我如何写一个好的答案?”:为链接提供上下文“鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户有所了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。”
  • 第二个链接坏了。
【解决方案2】:

验证器的客户端 API 是 here

您可能能够适应您的需求(这将通过客户端脚本禁用所有验证器):

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

所以你可以添加一个 if 块来检查验证器名称,或者更多的是 .controlToValidate 返回验证器的目标 ID - 然后禁用它:

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

如果您不需要检查任何进一步的验证器,您还应该在循环中添加一个中断(如果它是正确的)。您可以使用.some instead of .forEach 提前中断:

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

你可以把它封装成一个函数:

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;
        });
    };
};

并使用:

validatorState('txtCancellationReson', true);

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

【讨论】:

    【解决方案3】:

    对“RadioButtonList1”使用 CustomValidator 控件,并将控件可见性逻辑分离到另一个 javascript 函数。

    <div id="divTxt1">
        <asp:TextBox runat="server" CssClass="text" ID="txtNumber" type="number"/>
    </div>
    <div id="divTxt2">
    <asp:TextBox runat="server" CssClass="text" ID="txtNumber2"
    type="number"/>
    </div>
    <div id="radio">
        <asp:RadioButtonList ID="RadioButtonList1" runat="server"     RepeatDirection="Horizontal"      onchange:"javascript:toogleTexxBoxesVisibility(this);">
       <asp:ListItem Value="1" Selected="True">Privat</asp:ListItem>
       <asp:ListItem Value="2">Offentlig</asp:ListItem>
       </asp:RadioButtonList>
    <asp:CustomValidator ID="CustomValidator1" runat="server"     ClientValidationFunction="clientSideValidationFunction" ControlToValidate="RadioButtonList1" OnServerValidate="CustomValidator1_ServerValidate" Text="Validation Error Message">asp:CustomValidator>
    
    <script type="text/javascript">
    function clientSideValidationFunction(source,arguments)
        var inputvalue = arguments.Value; //RadioButtonList1's value
    
       if (inputvalue == "1" && $('#txtNumber').val() == '') {
            arguments.IsValid = false;
       }
       else if (inputvalue == "2" && $('#txtNumber2').val() == '') {
            arguments.IsValid = false;
       }
       else {
            arguments.IsValid = true;
       }
    };
    
    function toogleTexxBoxesVisibility(radiobutton)
    {
       if(radiobutton.val =='1')
       {
          $('#txtNumber').show('fast');
          $('#txtNumber2').hide('fast'); 
       }
      else if(radiobutton.val =='2')
      {
           $('#txtNumber').hide('fast');
           $('#txtNumber2').show('fast'); 
      }
    }
    </script>
    </div>
    

    【讨论】:

      【解决方案4】:

      我发现一个更好的选择是简单地使用:

      document.getElementById("<%=myValidator.ClientID %>").enabled = true;
      

      上面建议的 ValidatorEnabled 选项会自动调用链接控件的验证,并在我的例子中显示错误消息“请输入卖家名称的值”,这不是必需的或不需要的..

      使用“.enabled = true”选项不会。

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多