2011-04-01 121 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