How to create a normalExpressionAttribute with a dynamic template from a model property

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

I would like to create this attribute in which the template is derived from another property, rather than declaring a static one, as in the original RegularExpressionAttribute attribute.

Any ideas would be appreciated - Thanks

+6
source share
2 answers

Some of the lines should match the score:

 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; } } 

and then:

Model:

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

Controller:

 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); } } 

View:

 @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) <input type="submit" value="OK" /> } 
+6
source

To override the Validate method, which takes the ValidationContext parameter as a parameter, use ValidationContext to get the regular expression string from the associated property and apply the regular expression, returning the associated value.

0
source

Source: https://habr.com/ru/post/889101/


All Articles