2012-02-14 136 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