2010-03-31 53 views
36

我有一個帶有三個文本輸入的ASP.NET表單,每個用於「工作電話」,「家庭電話」和「手機」。每個文本輸入都有一個與之關聯的RequiredFieldValidator。我也有一個DropDownList,用戶可以選擇首選的電話類型。基於DropDownList的值動態啓用或禁用RequiredFieldValidator

我想只需要在DropDownList中選擇的字段。例如,如果用戶從DropDownList中選擇「工作電話」,我想要禁用「家庭電話」和「手機」的RequiredFieldValidator,從而只需要設置「工作電話」字段。

我有一個方法,基於DropDownList的值啓用和禁用這些驗證器,但我無法弄清楚什麼時候調用它。我希望此方法在驗證發生在頁面上之前運行。我會怎麼做?

+0

在這種情況下爲什麼不使用CustomValidator?關閉/打開RequiredFieldValidator將來可能會導致設計問題 - 我會堅持在需要的字段上使用它們。 – 2010-03-31 17:10:18

+0

感謝您的建議。我最終使用了一個CustomValidator。我之前沒有使用過它們,但是在建立之後,它變得更加強大。我很容易添加其他驗證。 – Jeremy 2010-04-02 00:50:41

+0

@Jason M:如果您將CustomValidator建議作爲答案,我會接受它。 – Jeremy 2010-04-05 23:56:57

回答

11

爲什麼不在這種情況下使用CustomValidator?關閉/打開RequiredFieldValidator將來可能會導致設計問題 - 我會堅持在需要的字段上使用它們。

+4

我不同意。我看不到未來設計問題的一種方法。特別是在簡單的情況下。 – 2011-07-08 15:00:23

+0

RequiredFieldValidator在大多數情況下保持簡單。 – etlds 2012-07-30 15:55:35

+0

CustomValidator不驗證空字段 – 2015-02-25 07:35:41

0

的OnChange的下拉列表中,你需要註冊一個服務器端事件處理程序,啓用/禁用驗證...

HTH

+0

您是否在談DropDownList的OnSelectedIndexChanged事件?我設置了該事件來調用啓用/禁用驗證器的方法,但事件在驗證之後纔會觸發。那時候已經太晚了。我需要它在驗證發生之前觸發。 – Jeremy 2010-03-31 17:05:52

+0

不,他意味着客戶端事件「onchange」 – 2010-03-31 17:15:26

+0

再次想到,我會首先渲染屏幕時僅顯示首選項的下拉列表。然後,當用戶選擇了首選項時,使用其相關的驗證器控件呈現文本框,而不是在客戶端上完成。 – Sunny 2010-03-31 18:24:21

39

你可以這樣用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); 
    .... 
}); 
+0

你有沒有試過這段代碼?看起來像一個很好的客戶端解決方案。我剛剛發佈了一個服務器端解決方案,但是這個看起來像是切換了客戶端驗證器,對吧? – citronas 2010-03-31 18:57:17

+0

@citronas - 是的,這應該切換驗證器客戶端沒有回發 – hunter 2010-03-31 18:57:51

+0

好! +1! – 2011-07-08 14:49:30

2

可能的辦法是:

  • 設置您的DropDownList AutoPostBack="true"
  • 在DropDownList的SelectedIndexChanged事件處理程序啓用/禁用驗證
  • 在您的DropDownList CausesValidation="false"中設置,以避免驗證程序在更改DropDownList條目時阻止回發。
+1

使驗證完美! – Anicho 2011-09-08 08:17:29

5

當您使用家庭電話時,在dropdown selectedindexchange事件中,使所需的字段驗證器不可見。

like ..

如果HOMEPHONE選擇,

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 
-1

這是很好的方式啓用和禁用服務器端從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); 
    } 
} 
相關問題