C# 多国验证规则

C# 多国验证规则,c#,.net,asp.net-mvc,asp.net-mvc-3,data-annotations,C#,.net,Asp.net Mvc,Asp.net Mvc 3,Data Annotations,在我的多国网站中,我有一个地址创建表单。我想按国家自定义我的验证规则(例如:FR ZipCode length 8,USA:10…),我在许多解决方案之间犹豫不决:按国家定制一个ViewModel、参数化注释、数据过滤器。。。有什么想法吗 public class Address { [Required] public string Name { get; set; } [StringLength(lengthByCountry)] public string Z

在我的多国网站中,我有一个地址创建表单。我想按国家自定义我的验证规则(例如:FR ZipCode length 8,USA:10…),我在许多解决方案之间犹豫不决:按国家定制一个ViewModel、参数化注释、数据过滤器。。。有什么想法吗

public class Address
{
    [Required]
    public string Name { get; set; }
    [StringLength(lengthByCountry)]
    public string ZipCode { get; set; }
}

您可以使用编写自己的验证器,根据国家/地区对邮政编码进行特定于国家/地区的验证。

如果需要在同一提交中指定国家/地区和邮政编码,那么我建议让您的模型实现IValidatableObject,它允许您根据值的组合进行验证

public class Address : IValidatableObject
{
    [Required]
    public string Name { get; set; }

    public string Country { get; set; }

    public string ZipCode { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {

        var results = new List<ValidationResult>();

        switch (Country)
        {
            case "France":
                if (ZipCode.Length < 8)
                    results.Add(
                        new ValidationResult("French zip codes must be at least 8 characters", new List<string> { "ZipCode" })
                    );
                break;

            case "U.S.":
                if (ZipCode.Length < 10)
                    results.Add(
                        new ValidationResult("American zip codes must be at least 10 characters", new List<string> { "ZipCode" })
                    );
                break;

            // Etc.
        }

        return results;

    }

}
公共类地址:IValidatableObject
{
[必需]
公共字符串名称{get;set;}
公共字符串国家{get;set;}
公共字符串ZipCode{get;set;}
公共IEnumerable验证(ValidationContext ValidationContext)
{
var results=新列表();
交换机(国家/地区)
{
案例“法国”:
if(ZipCode.Length<8)
结果。添加(
新的ValidationResult(“法语邮政编码必须至少为8个字符”,新列表{“ZipCode”})
);
打破
“美国”案:
if(ZipCode.Length<10)
结果。添加(
新的ValidationResult(“美国邮政编码必须至少为10个字符”,新列表{“ZipCode”})
);
打破
//等等。
}
返回结果;
}
}

我真的不明白为什么几乎所有建议使用IValidateableObject的人都没有提到它不进行客户端验证。在许多情况下,这是一个完全可以接受的解决方案,但人们需要知道,这可能会导致他们的验证工作流出现异常。使用CustomValidationAttribute,我必须手动执行客户端验证,对吗?@rad:CustomValidationAttribute允许您插入验证框架并编写自己的验证程序,该验证程序除了检查字符串长度或使用正则表达式外,还可以执行其他操作。这是“手动”工作,是的,但您不必在代码中调用验证方法。正如使用
StringLengthAttribute
时不必调用任何字符串长度检查一样。