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

本文关键字:REGEX 用户 输入 另一个 选择 MVC 模型 忽略 | 更新日期: 2023-09-27 18:20:32

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

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进行验证。有人能建议模型本身是否可能做到这一点吗?

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

有几个不同的选项可供选择:

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

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

您可以使用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;
         }
      }
   }
}