2012-02-14 102 views
5

我有一个用户控件,我有两个面板,一个在左边,另一个在右边,左边有一些客户账单信息,右边有一些送货信息,每个字段在发货信息中有一个requiredfieldvalidator,这些面板被封装在更新面板中。默认状态是两个面板都可见,面板下方有一个复选框,显示“运费与结算相同”,当您选中右侧面板“运输面板”时,面板将消失,然后您继续。验证仍然显示,虽然禁用

问题:可以说,我删除了运输名称的文本,我不点击其他地方,然后我去勾选“同计费”了一会儿就用红色显示的验证,然后自败。我曾尝试创建禁用验证即

RequireFieldValidator1.Enabled = false; 

它工作正常的方面,它没有显示发货面板自败之前验证功能,但可以说,我改变了主意,再次单击它,以显示它。现在,当我在装运面板中删除名称并单击其他地方时,它不会让我去任何地方,但它不显示验证文本。

所以,我没有这样的逻辑:

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

但现在它就像我上面的实例阐述,明确了运输名称,并单击checbox ..我可以随时看到红色的验证回到了相同的行为。

相关代码

//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.. 
    } 
} 

回答

5

您是否尝试过在Javascript中(不是服务器端)禁用验证器,然后再执行UpdatePanel的回发?

您可以使用下面的函数客户端禁用您的验证:

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

这应该停止验证的“闪光”。你可以根据你的CheckBox更改客户端。

您也可以将每个部分的所有验证器都包含在单独的组中,然后一次禁用整个验证器组。看到下面的SO线程的详细信息:

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

+0

使用jquery方法,非常感谢。..我不是一个专家,但我怎么能检查jQuery中复选框的状态? (无论是否选中)?再一次感谢你 – user710502 2012-02-14 18:42:28

0
private void DisableEnableShippingFieldsValidations(bool enableFields) 
{ 
    if (enableFields) 
     ckBilling.CausesValidation = false; 
    else 
     ckBilling.CausesValidation = true; 
} 

通过使用复选框的原因验证属性,你是通过传递验证。


建议

虽然做验证,请使用验证组属性来验证控件和按钮/复选框,将做验证。

+0

为什么不重新编写该方法的一个行:'ckSameBilling.CausesValidation = enableFields;'!?根据我的经验,多个代码路径比单独依赖数据的代码路径更难读取。(如果有人在不支持示例的情况下写了它,我会在最后一句话中提到,但这里是完美的支持示例!:) – sarnold 2012-02-14 22:34:46

相关问题