Validar modelo en valores de cadena específicos

Validar modelo en valores de cadena específicos

En caso de que alguien tropiece con este hilo en el futuro, lo llevé un poco más lejos y agregué una propiedad de matriz de cadenas pública que aceptaba los valores permitidos en el filtro de validación. Esto le permitirá proporcionar una colección de cadenas válidas en el decorador de atributos.

De esta forma, ahora tiene un atributo reutilizable genérico que puede usar en cualquier momento para limitar una propiedad de cadena de modelo a un conjunto predefinido de valores. Dado que es un atributo de validación, también puede decorarlo con un mensaje de error más informativo.

Ejemplo de uso:

public class Person {
    [StringRange(AllowableValues = new[] { "M", "F" }, ErrorMessage = "Gender must be either 'M' or 'F'.")]
    public string Gender { get;set; }
}

Atributo de cadena:

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

Para validar la propiedad Género, he creado un atributo de validación personalizado creando una nueva clase (atributo):

using System;
using System.Collections.Generic;
using System.Web;
using System.ComponentModel.DataAnnotations;    

namespace MyProject.Models.Validation
{

    public class StringRangeAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {

            if(value.ToString() == "M" || value.ToString() == "F")
            {
                return ValidationResult.Success;
            }


            return new ValidationResult("Please enter a correct value");
        }
    }
}

puede usar una expresión regular como esta:

[RegularExpression("M|F", ErrorMessage = "The Gender must be either 'M' or 'F' only.")]
public string Gender { get; set; }

pero en mi api mostrará un mensaje de error cuando pasé datos para que pueda agregar

[StringLength(1, MinimumLength = 1, ErrorMessage = "The Gender must be 1 characters.")]

código final:

[StringLength(1, MinimumLength = 1, ErrorMessage = "The Gender must be 1 characters.")]
[RegularExpression("M|F", ErrorMessage = "The Gender must be either 'M' or 'F' only.")]
public string Gender { get; set; }