忽略MVC模型中的REGEX或根据用户输入选择另一个REGEX

时间:2013-06-30 18:24:11

标签: c# asp.net-mvc

我的一个班级中有两个字段用于地址,如

public string Country { get; set; }
[Required(ErrorMessage = "Postcode is required")]
[RegularExpression(@"REGEX", 
ErrorMessage = "Please enter a valid UK Postcode)]
public string postcode { get; set;}

但是,如果用户选择英国以外的国家/地区,那么我希望我的邮政编码字段至少忽略REGEX,并且在理想的世界中根据国家/地区使用其他REGEX进行验证。任何人都可以建议模型本身是否可行?

2 个答案:

答案 0 :(得分:2)

您可以选择几种不同的选项:

  1. 创建100%自定义验证属性,将RequiredRegularExpression属性组合在一起。因此,在该自定义属性中,您将执行所需的所有验证,并将值与Country属性进行比较,以根据需要有选择地应用RegEx。

  2. 为您关注的每个国家/地区创建一个不同的postcode属性,并使用类似`RequiredIfAttribute(请参阅RequiredIf Conditional Validation Attribute)来确定实际需要哪个属性。然后,您可以使用Javascript来显示/隐藏相应的输入字段。

答案 1 :(得分:2)

您可以使用IValidatableObject

执行此操作
class MyClass : IValidatableObject {

   public string Country { get; set; }

   [Required(ErrorMessage = "Postcode is required")]
   public string postcode { get; set;}

   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {

      if (!String.IsNullOrEmpty(Country) 
         && !String.IsNullOrEmpty(postcode)) {

         switch (Country.ToUpperInvariant()) { 
            case "UK":
               if (!Regex.IsMatch(postcode, "[regex]"))
                  yield return new ValidationResult("Invalid UK postcode.", new[] { "postcode" });
               break;

            default:
               break;
         }
      }
   }
}