【问题标题】:Enable/disable RequiredValidator on client-side / CustomValidator not firing在客户端启用/禁用RequiredValidator / CustomValidator 未触发
【发布时间】:2010-04-23 14:44:47
【问题描述】:

我有一个下拉菜单,用户可以在其中选择国家/地区。这是一个必填的“字段”。

在它旁边,有一个名为 State 的文本字段。如果用户选择 US,则字段 State 是必需的。如果用户选择例如瑞典,不需要国家,因为瑞典没有国家。

示例代码:

<asp:DropDownList runat="server" ID="Country"></asp:DropDownList>
<asp:RequiredFieldValidator ControlToValidate="Country"
                runat="server" Display="Static" ErrorMessage="Required field" />

<asp:TextBox runat="server" ID="State"></asp:TextBox>
<asp:CustomValidator ClientValidationFunction="DoesntGetFiredIfStateIsEmpty"
                runat="server" Display="Static" ErrorMessage="Required field" />

<!-- SO, RATHER THIS TOGETHER WITH CONDITIONAL FIRING -->
<asp:RequiredFieldValidator ControlToValidate="State"
                runat="server" Display="Static" ErrorMessage="Required field" />

我的问题是:如何在 CustomValidator 为空时进行触发验证?

或者更简单地说:我怎样才能有条件地触发RequiredValidator?

或者最简单的:如何在客户端启用/禁用RequiredValidator?

【问题讨论】:

    标签: asp.net customvalidator requiredfieldvalidator


    【解决方案1】:

    尝试使用 javascript 来启用和禁用验证器

    ValidatorEnable(RequiredFieldValidatorId, false);
    

    查看this question that I answered。

    【讨论】:

    • 看起来很有希望,但我在 ASP.NET 生成的 JS 中得到“val.style is undefined”...
    • 我搞定了。验证器有一个带有 display: none 的父节点;设置它,这破坏了 ValidatorEnable 的功能。
    • 第一个参数实际上应该是验证器本身,而不是验证器的ID。
    • @hunter 我看到了,但我认为这里仍然值得指出。您的 sn-p 涉及传入“RequiredFieldValidatorId”,当它不应该是 ID 时,我认为这有点误导。
    【解决方案2】:

    Asp.net 有一个客户端 javascript 函数来管理验证器,“ValidatorEnable”函数,

    ValidatorEnable(RequiredFieldValidatorId, false);
    

    您可以简单地使用 javascript 调用它,您必须将验证器对象发送给函数(不仅仅是它的 id)。

    if (x==y) {
            ValidatorEnable($('#<%=rfvFamily.ClientID %>'), false);    
        } else {
            ValidatorEnable($('#<%=rfvFamily.ClientID %>'), true);
        }
    

    或

    if (x==y) {
            ValidatorEnable(document.getElementById("<%=rfvFamily.ClientID %>", false);    
        } else {
            ValidatorEnable(document.getElementById("<%=rfvFamily.ClientID %>", true);
        }
    

    完整的文档: http://msdn.microsoft.com/en-us/library/Aa479045#aspplusvalid_clientside

    另一种方法是在您的 DropDownList CausesValidation="false" 中设置,以避免在您更改 DropDownList 条目时验证器阻止回发。

    (*) 记住这个功能是针对客户端的,要在服务器端禁用验证器,你也必须在页面回发时禁用验证器。

    if (IsPostBack){
        if (x==y) {
            rfvFamily.Enabled = false;
        }
    }
    

    【讨论】:

    • 你需要传入元素,而不是id。
    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2023-03-23
    • 2011-08-26
    相关资源
    最近更新 更多