如何使用动态模式创建regularExpressionAttribute来自model属性

public class City { [DynamicReqularExpressionAttribute(PatternProperty = "RegEx")] public string Zip {get; set;} public string RegEx { get; set;} } 

我想创建这个属性,其中模式来自其他属性,而不像原始的RegularExpressionAttribute那样声明静态。

任何想法将不胜感激 – 谢谢

线条之间的某些东西应符合要求:

 public class DynamicRegularExpressionAttribute : ValidationAttribute { public string PatternProperty { get; set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { PropertyInfo property = validationContext.ObjectType.GetProperty(PatternProperty); if (property == null) { return new ValidationResult(string.Format("{0} is unknown property", PatternProperty)); } var pattern = property.GetValue(validationContext.ObjectInstance, null) as string; if (string.IsNullOrEmpty(pattern)) { return new ValidationResult(string.Format("{0} must be a valid string regex", PatternProperty)); } var str = value as string; if (string.IsNullOrEmpty(str)) { // We consider that an empty string is valid for this property // Decorate with [Required] if this is not the case return null; } var match = Regex.Match(str, pattern); if (!match.Success) { return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); } return null; } } 

然后:

模型:

 public class City { [DynamicRegularExpression(PatternProperty = "RegEx")] public string Zip { get; set; } public string RegEx { get; set; } } 

控制器:

 public class HomeController : Controller { public ActionResult Index() { var city = new City { RegEx = "[0-9]{5}" }; return View(city); } [HttpPost] public ActionResult Index(City city) { return View(city); } } 

视图:

 @model City @using (Html.BeginForm()) { @Html.HiddenFor(x => x.RegEx) @Html.LabelFor(x => x.Zip) @Html.EditorFor(x => x.Zip) @Html.ValidationMessageFor(x => x.Zip)  } 

覆盖将ValidationContext作为参数的Validate方法,使用ValidationContext从相关属性中获取正则表达式字符串并应用正则表达式,返回匹配的值。