2011-04-01 104 views
3

我有幾個場景,我需要創建:基於其他領域的條件驗證,c#

1)如果下拉列表中有一個特定的值,使一個特定的文本框爲必填字段。

2)如果一個特定的文本框有數據,讓需要另一個文本框(如果地址字段填入,需要城市,州和郵編)

我有一些代碼從一對CustomValidators的調用看起來正確:

<asp:CustomValidator ID="cvtxt_pat_id" runat="server" 
    OnServerValidate="txt_pat_idValidate" ControlToValidate="txt_pat_id" 
    ErrorMessage="Text must be 8 or more characters." Display="Dynamic"/> 

protected void txt_pat_idValidate(object sender, ServerValidateEventArgs e) 
{ 
    if (ddl_addl_pat_info.SelectedValue.ToString() == "2") 
    { 
     e.IsValid = (e.Value.Length > 1); 
    } 
    else 
    { 
     e.IsValid = true; 
    } 
} 

<asp:CustomValidator ID="cvtxt_pat_id" runat="server" 
    OnServerValidate="addresspartsValidate" ControlToValidate="txt_city" 
    ErrorMessage="Complete address must be entered." Display="Dynamic"/> 

protected void addresspartsValidate(object sender, ServerValidateEventArgs e) 
{ 
    if (txt_pat_address.Text.Length > 1) 
    { 
     e.IsValid = (e.Value.Length > 1); 
    } 
    else 
    { 
     e.IsValid = true; 
    } 
} 

但據我瞭解,如果我的測試是空的文本框,框從未驗證,因此這些不火,如果他們是空白的,哪種使得它很難檢查必填字段。所以...想法?

另外,關於是否需要我的測試的客戶端和服務器版本,我遇到了衝突的故事。也許這是舊版本所要求的,現在不是?

回答

4

你必須考慮一點。你的自定義驗證器應該放在應該顯示錯誤的項目上(特定文本框)。文本框上的自定義驗證程序應檢查下拉列表以查看下拉列表是否具有觸發文本框所需條件所需的特定條件。如果它被發現是真的,那麼你想檢查文本框是否有輸入並相應地返回args.IsValid。

protected void cvTimeOfDay_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    if(ddlTimeOfDay.SelectedValue == "1" && txtbAddress.Text.Length == 0) 
     args.IsValid = false; 
    else 
     args.IsValid = true; 
} 

var MyValidation = { 
    DropdownValidation: function (sender, eventArgs) { 
     var isValid; 
     if (eventArgs && $('#ddlTimeOfDay').val() == '1') { 
      isValid = false; 
     } 
     else 
      isValid = true; 
     eventArgs.IsValid = isValid; } 
    } 

<asp:DropDownList ID="ddlTimeOfDay" runat="server" ClientIDMode="Static"> 
<asp:ListItem Text="-Select-" Value="0"></asp:ListItem> 
<asp:ListItem Text="PM" Value="1"></asp:ListItem> 
<asp:ListItem Text="AM" Value="2"></asp:ListItem> 
</asp:DropDownList> 
<br /> 
<asp:TextBox Text="" ID="txtbAddress" runat="server" ClientIDMode="Static"></asp:TextBox> 
<asp:CustomValidator ID="cvTimeOfDay" runat="server" 
    ErrorMessage="MustSelectValue" 
    ClientValidationFunction="MyValidation.DropdownValidation" 
    ControlToValidate="txtbAddress" ValidationGroup="group1" 
    onservervalidate="cvTimeOfDay_ServerValidate" ValidateEmptyText="true"></asp:CustomValidator> 
<asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="group1"/> 

要驗證帶有自定義驗證程序的空白文本框,您需要將ValidateEmptyText屬性設置爲「true」。

如果您的網站無法確保JavaScript已打開以使用該頁面,通常會同時使用兩者。某些瀏覽器可以關閉JavaScript;如果JavaScript被關閉,它會繞過您的驗證。使用客戶端驗證是很好的,因爲它不會每次都回發驗證輸入,而是直接在客戶端上進行驗證。

+0

我認爲在JavaScript中的「EventArgs」之後會有一些代碼丟失 - 我需要調用EventArgs.value。這是工作: 函數txtPat_idValidate(發件人,eventArgs){ var isValid;如果($('#ddl_addl_pat_info').val()=='2') isValid =!(eventArgs.Value ==「」|| eventArgs.Value.length <8) else isValid = true; eventArgs.IsValid = isValid; } 當然,我必須弄清楚你也在使用jQuery。 – VBartilucci 2011-04-04 16:25:09

+1

是的,我使用jQuery庫和它的選擇器來通過ID獲取文本框。我認爲這是顯而易見的,因爲jQuery的語法和流行度,我的錯不包括這一點。另外需要注意的是,這種方法只能用於.NET 4.0。在.NET 4.0中,您無法設置ClientIDMode,並且顯示給客戶端的ID(ClientID)與在後面的代碼(ID)中設置的ID不同。 eventArgs後沒有代碼丟失。我正在檢查eventArgs是否爲null或有值。 示例:eventArgs = null 'var eventArgs; if(eventArgs) console.log('Has Value'); else console.log('Null');' ' – LCarter 2011-04-04 18:48:23

+0

不錯的工作,這將很方便。 – 2011-11-10 21:35:20