如果选择“美国”作为国家/地区,则仅验证城市,州和邮政编码

时间:2011-01-28 21:30:14

标签: c# .net customvalidator requiredfieldvalidator

我需要创建一个用户控件,其中包含Country(下拉列表),Address(文本框),City(文本框),State(下拉列表)和Zip(文本框)的表单字段。如果从下拉列表中选择“美国”,我只想验证City,State和Zip。通过“验证”我的意思是检查长度 - 就是这样。

我尝试过使用自定义验证器,但我遗漏了一些东西,因为看起来应该工作的代码没有做任何事情。例如:

<asp:CustomValidator ErrorMessage="City, State, and Zip are required fields" 
Display="None" ID="LocationValidator" 
runat="server" ClientValidationFunction="validateLocation" 
onservervalidate="LocationValidator_ServerValidate">
</asp:CustomValidator>

然后这是我的验证码

客户端验证:

function validateLocation(sender, args) {
    var country = jQuery("#main_2_MailingAddress_Country").val();
    var city = jQuery("#main_2_MailingAddress_City").val();
    if (city.Length() > 0)
    {
        args.IsValid = true;
    }
    else
    {
        args.IsValid = country != "United States";
    }
}

服务器端验证:

protected void LocationValidator_ServerValidate(object source, ServerValidateEventArgs args)
    {
        if (City.Text.Length > 0)
        {
            args.IsValid = true;
        }
        else //nothing was entered for "City"
        {
            args.IsValid = Country.SelectedValue != "United States";
        }
        //similar functions for State and Zip go here
    }

如果我只进行服务器端验证并且不填写表单上的任何内容(除了地址字段之外还有其他必填字段),那么我对其他字段的RequiredFieldValidators会触发。但是,如果我填写除City,State和Zip之外的所有字段(为国家选择美国),那么表单提交时不会发现它们是空的。

如果我为自定义验证器指定客户端和服务器端验证(如上例所示),则不会触发任何验证器并提交表单。

我意识到这可能是一个漫长而令人困惑的帖子,但对于我出错的地方有什么想法吗?

1 个答案:

答案 0 :(得分:2)

很难说RequiredFieldValidators出了什么问题,因为它们不在示例中(您是否指定了要验证的控件?),但这里有一个例子可以帮助您:

protected void LocationValidator_ServerValidate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = IsCountryValid();
        }

        private bool IsCountryValid()
        {
            if (Country.SelectedValue == "US")
            {
                if (String.IsNullOrEmpty(City.Text))
                    return false;

                if (String.IsNullOrEmpty(State.SelectedValue))
                    return false;

                if (String.IsNullOrEmpty(Zip.Text))
                    return false;
            }
            else if (String.IsNullOrEmpty(Country.SelectedValue))
            {
                return false;
            }

            return true;
        }

我将显示更改为“动态”,以便能够看到消息:

<asp:CustomValidator ID="LocationValidator" runat="server" 
            ErrorMessage="City, State, and Zip are required fields" Display="Dynamic" 
            OnServerValidate="LocationValidator_ServerValidate"></asp:CustomValidator>

如果您在下拉列表中有值而不是空字符串,那么显然会更改这些值的验证,但我希望这会有所帮助!