【问题标题】:Dynamically enable or disable RequiredFieldValidator based on value of DropDownList根据 DropDownList 的值动态启用或禁用RequiredFieldValidator
【发布时间】:2011-02-03 00:48:12
【问题描述】:

我有一个带有三个文本输入的 ASP.NET 表单,“工作电话”、“家庭电话”和“手机”各一个。这些文本输入中的每一个都有一个与之关联的RequiredFieldValidator。我还有一个 DropDownList,用户可以在其中选择首选电话类型。

我只想要求在 DropDownList 中选择的字段。例如,如果用户从 DropDownList 中选择“工作电话”,我想禁用“家庭电话”和“手机”的RequiredFieldValidator,从而只需要“工作电话”字段。

我有一个方法可以根据 DropDownList 的值启用和禁用这些验证器,但我不知道何时调用它。我希望在页面上进行验证之前运行此方法。我该怎么做?

【问题讨论】:

  • 在这种情况下为什么不使用 CustomValidator 呢?关闭/打开 RequiredFieldValidator 可能会在未来导致设计问题 - 我会坚持在需要的字段上使用它们。
  • 感谢您的建议。我最终使用了 CustomValidator。我以前没有使用过它们,但是在我设置它之后,它就更强大了。我还可以轻松添加其他验证。
  • @Jason M:如果您将 CustomValidator 的建议作为答案,我会接受。

标签: asp.net validation requiredfieldvalidator


【解决方案1】:

您可以像这样使用 JavaScript 来做到这一点:

ValidatorEnable(RequiredFieldValidatorId, false);

然后让你的下拉列表使用 onchange 事件(我建议使用 jQuery)

$("#<%=dropDownList.ClientID %>").change(function(){
    var val = $(this).val();
    var skip = null;
    if (val == 1)
       skip = "workPhoneValidator";
    else if (val == 2)
       skip = "cellPhoneValidator";
    ....

    // by popular demand...
    var $skip = $("#" + skip)[0];

    if (skip != "workPhoneValidator") ValidatorEnable($skip, false);
    if (skip != "cellPhoneValidator") ValidatorEnable($skip, false);
    ....
});

【讨论】:

  • 你试过这个代码吗?看起来像一个不错的客户端解决方案。我正要发布一个服务器端解决方案,但这个看起来像是切换客户端验证器,对吧?
  • 我知道这是一篇旧帖子,但ValidatorEnable 的第一个参数是一个 DOM 元素,而不是字符串 ID。
  • @hunter ValidatorEnable(RequiredFieldValidatorId, false); 应该是 ValidatorEnable(document.getElementById(RequiredFieldValidatorId), false);
  • @hunter 没有代码显示它在哪里声明/初始化,所以它有点像“那是什么?”当你看到这两个变量时。
  • 注意:这将不会停止服务器端验证,因此Page.IsValid 将失败。
【解决方案2】:

在这种情况下为什么不使用 CustomValidator 呢?关闭/打开 RequiredFieldValidator 可能会在未来导致设计问题——我会坚持在需要的字段上使用它们。

【讨论】:

  • 我不同意。我看不到未来设计问题的方法。特别是在简单的情况下。
  • RequiredFieldValidator 在大多数情况下保持简单。
  • CustomValidator 不验证空字段
【解决方案3】:

当您使用家庭电话时,在下拉 selectedindexchange 事件中,使必填字段验证器不可见。

喜欢..

如果选择了家庭电话,

homephonevalidator.visible=true
cellphonevalidator.visible=false
workphonevalidator.visible=false

如果选择手机,

homephonevalidator.visible=false
cellphonevalidator.visible=true 
workphonevalidator.visible=false

如果选择了工作电话,

homephonevalidator.visible=false
cellphonevalidator.visible=false
workphonevalidator.visible=true

【讨论】:

    【解决方案4】:

    可能的方式是:

    • 在你的下拉列表中设置AutoPostBack="true"
    • 在 DropDownList 的 SelectedIndexChanged 事件处理程序中启用/禁用您的验证器
    • 在您的 DropDownList 中设置 CausesValidation="false" 以避免在您更改 DropDownList 条目时验证器阻止回发。

    【讨论】:

      【解决方案5】:

      下拉的OnChange事件你可能有这样的东西

      function EnableValidator(){
          ValidatorEnable(requiredFieldValidator, validatorMustBeEnabled);
      } 
      

      检查此网址。 “客户端 API”部分

      http://msdn.microsoft.com/en-us/library/Aa479045#aspplusvalid_clientside

      【讨论】:

      • 确保 EnableClientScript 为真
      【解决方案6】:

      DropDownlist 的 OnChange,您将需要注册一个启用/禁用验证器的服务器端事件处理程序...

      HTH

      【讨论】:

      • 你说的是 DropDownList 的 OnSelectedIndexChanged 事件吗?我设置该事件来调用启用/禁用验证器的方法,但该事件直到验证后才会触发。到那时,为时已晚。我需要在验证发生之前触发它。
      • 不,他的意思是客户端事件“onchange”
      • 再想一想,我会首先渲染屏幕,其中只有首选项选择的下拉菜单。然后,当用户选择了首选项后,呈现一个带有相关验证器控件的文本框,而不是在客户端上全部完成。
      【解决方案7】:

      这是从 jquery 事件启用和禁用服务器端控件验证的好方法:

      <label class="label_radio" for="Oversize"  onclick="EnableDisbledValidator('show')">show textbox</label>
      
      <asp:TextBox ID="txtNote" runat="server" class="checkvalidation"></asp:TextBox>
      
       <asp:RequiredFieldValidator ID="rfvNote" runat="server" ControlToValidate="txtNote" SetFocusOnError="true" ErrorMessage="Please enter the note" Display="Dynamic" CssClass="error-tooltip"></asp:RequiredFieldValidator>
      
      function EnableDisbledValidator(lblShow) {
          if (lblShow == "hide") {;
              ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], false);
      
          } else {
              ValidatorEnable($('#<%=rfvNote.ClientID %>')[0], true);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-11
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 2020-05-05
        相关资源
        最近更新 更多