【问题标题】:conditional validation based on other fields, c#基于其他字段的条件验证,c#
【发布时间】:2011-04-01 21:07:28
【问题描述】:

我需要创建几个场景:

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;
    }
}

但据我了解,如果我正在测试的文本框为空,则该框永远不会验证,因此如果它们为空,则不会触发,这使得检查必填字段变得困难。那么……想法?

另外,关于我是否需要同时拥有客户端和服务器版本的测试,我得到了相互矛盾的故事。也许在旧版本中是必需的,现在不需要了?

【问题讨论】:

    标签: c# validation customvalidator


    【解决方案1】:

    你必须想得有点倒退。您的自定义验证器应位于应显示错误的项目(特定文本框)上。文本框上的自定义验证器应检查下拉列表以查看下拉列表是否具有触发文本框所需条件所需的特定条件。如果发现是真的,那么你要检查文本框是否有输入并相应地返回 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 被关闭,它会绕过您的验证。使用客户端验证很好,因为它不会每次都回传来验证输入,而是直接在客户端进行。

    【讨论】:

    • 我认为在您的 javascript 中的“EventArgs”之后缺少一些代码 - 我需要深入了解 EventArgs.value。这是有效的: function txtPat_idValidate(sender, eventArgs) { var isValid; if ($('#ddl_addl_pat_info').val() == '2') isValid = !(eventArgs.Value == "" || eventArgs.Value.length
    • 是的,我正在使用 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('Is Null'); `
    • 干得好,这会很方便。
    • 客户端函数需要检查txtbAddress。如果它的本地 isValid 被命名为 IsValid (即大写“I”)或被取消,它会为我节省很多时间来遵循你的其他好例子。
    • 我会在我重新阅读后更正它。我已经快 6 年没有看到这个代码了。 ;)
    猜你喜欢
    • 2015-07-24
    • 2021-04-10
    • 2018-01-12
    • 1970-01-01
    • 2011-08-27
    • 2017-09-08
    • 2023-03-10
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多