【问题标题】:Validation still showing although disabled尽管已禁用,但验证仍然显示
【发布时间】:2012-02-14 18:02:02
【问题描述】:

我有一个用户控件,其中有两个面板,一个在左侧,另一个在右侧,左侧是一些客户账单信息,右侧是一些运输信息,运输信息中的每个字段都有一个 requiredfieldvalidator,这些面板被包装在一个更新面板中。默认状态是两个面板都是可见的,面板下方有一个复选框,上面写着“运输与计费相同”,当您选中它时,右侧的面板“运输面板”消失,然后您继续。

问题:假设我删除了运输名称中的文本并且我没有点击其他任何地方,然后我转到复选框“与计费相同”一会儿,它以红色显示验证,然后然后它消失了。我尝试创建一个禁用验证器的函数,即

RequireFieldValidator1.Enabled = false;

它工作正常,因为它在运输面板消失之前不显示验证,但可以说我改变主意并再次单击它以显示它。现在,当我删除运输面板中的名称并单击其他位置时,它不会让我去任何地方,但它不会显示验证文本。

所以我做了这个逻辑:

if (ckSameBilling.checked)
{
     RequiredFieldValidator.Enabled = false;
}
else
{
      RequiredFieldValidator.Enabled = true;
}

但现在它又回到了我上面演示的相同行为,清除运输名称并单击复选框.. 我可以立即看到红色验证。

相关代码

//All this is wrapped in an update panel
<asp:Panel ID="pnl" runat="server"><div>
    asp:TextBox ID="txtShippingFirstName" runat="server" Width="130px" Columns="30"
     MaxLength="100" asp:TextBox><div>

<asp:RequiredFieldValidator ID="Requiredfieldvalidator1" ErrorMessage="Name Required"
    ControlToValidate="txt" 
    runat="server" Display="Dynamic" CssClass="Error">
</asp:RequiredFieldValidator>
</asp:Panel>

<div style="margin-left: 145px;">
    <asp:CheckBox ID="Billing" runat="server" Font-Bold="True"
        Text"Same as Billing" OnCheckedChanged="Billing_CheckedChanged"
        AutoPostBack="True" />
</div>

代码隐藏:

protected void Billing_CheckedChanged(object sender, EventArgs e)
{    
    if (Billing.Checked)
    {
        //Disable the shipping fields validations
        DisableEnable(true);
        pnl.Visible = false;
    }
    else
    {
        DisableEnable(false);
        pnl.Visible = true;
    }
}

private void DisableEnable(bool enable)
{
    if (enableFields)
    {
        Requiredfieldvalidator1.Enabled = false;
        //a bunch of required validations below...
    }
    else
    {
        Requiredfieldvalidator1.Enabled = true;
        //a bunch of required validations below..
    }
}

【问题讨论】:

    标签: c# asp.net validation requiredfieldvalidator


    【解决方案1】:

    在回发UpdatePanel 之前,您是否尝试过禁用 Javascript(不是服务器端)中的验证器?

    您可以使用以下功能客户端来禁用您的验证器:

    var yourValidator = document.getElementById('yourValidatorClientID')
    ValidatorEnable(yourValidator, false);
    

    这应该会停止验证的“闪现”。你可以基于你的CheckBox改变客户端。

    您还可以将所有验证器包含在每个部分的单独组中,然后一次禁用整个验证器组。有关详细信息,请参阅以下 SO 线程:

    Enable/disable asp.net validator controls within a specific "ValidationGroup" with jQuery?

    【讨论】:

    • 使用 jquery 方法,非常感谢.. 我不是这方面的专家,但我如何检查 jquery 中复选框的状态? (无论是否检查)?再次感谢您
    【解决方案2】:
    private void DisableEnableShippingFieldsValidations(bool enableFields)
    {
        if (enableFields)
            ckBilling.CausesValidation = false;
        else
            ckBilling.CausesValidation = true;
    }
    

    通过使用复选框的原因验证属性,您就是通过了验证。


    建议

    在进行验证时,请使用 Validation Group 属性来验证控件和用于验证的按钮/CheckBox。

    【讨论】:

    • 为什么不将该方法重写为一行:ckSameBilling.CausesValidation = !enableFields;?根据我的经验,多个代码路径比依赖数据的单个代码路径更难阅读。 (如果有人在没有支持示例的情况下写最后一句话,我会,但这是完美的支持示例!:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2016-10-26
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多