Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate model on specific string values

Tags:

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".

like image 425
kwv84 Avatar asked Oct 07 '15 08:10

kwv84


People also ask

Can we do validation in MVC using data annotations?

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.


1 Answers

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);     } } 
like image 75
Simon Wosko Avatar answered Sep 29 '22 11:09

Simon Wosko