I'm working on a Web API 2 project. besides the requirement that some properties are required, some only can have specific values. One option is that I could try to save the model to the database (EF6) and create some logic while saving, but I think it is better to validate if the correct value is set before I make a call to the database. Does data annotations provide an attribute like Range but then for specific string values like in the example below? Or do I have to write my own validator attribute?
public class Person { public int PersonID { get; set; } [Required] public string FirstName { get; set; } public string LastName { get; set; } [StringRange("M","F")] public string Gender { get; set; } }
In the above example, when a post is done to the controller, the only values to accept are "M" or "F".
In ASP.NET MVC, Data Annotation is used for data validation for developing web-based applications. We can quickly apply validation with the help of data annotation attribute classes over model classes.
In case anyone stumbles upon this thread in the future, I took it a little further and added a public string array property accepting the allowable values in the validation filter. This will allow you to provide a collection of valid strings in the attribute decorator.
This way, you now have a generic reusable attribute you can use anytime to limit a model string property to a predefined set of values. Since it's a validation attribute, you can decorate it with a more informative error message as well.
Example Usage:
public class Person { [StringRange(AllowableValues = new[] { "M", "F" }, ErrorMessage = "Gender must be either 'M' or 'F'.")] public string Gender { get;set; } }
String Attribute:
public class StringRangeAttribute : ValidationAttribute { public string[] AllowableValues { get; set; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (AllowableValues?.Contains(value?.ToString()) == true) { return ValidationResult.Success; } var msg = $"Please enter one of the allowable values: {string.Join(", ", (AllowableValues ?? new string[] { "No allowable values found" }))}."; return new ValidationResult(msg); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With