Saltar al contenido

ASP.NET MVC: Validación personalizada por DataAnnotation

Necesitamos tu ayuda para compartir nuestras crónicas acerca de las ciencias de la computación.

Podrías escribir una validación personalizada attribute:

public class CombinedMinLengthAttribute: ValidationAttribute

    public CombinedMinLengthAttribute(int minLength, params string[] propertyNames)
    
        this.PropertyNames = propertyNames;
        this.MinLength = minLength;
    

    public string[] PropertyNames  get; private set; 
    public int MinLength  get; private set; 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    
        var properties = this.PropertyNames.Select(validationContext.ObjectType.GetProperty);
        var values = properties.Select(p => p.GetValue(validationContext.ObjectInstance, null)).OfType();
        var totalLength = values.Sum(x => x.Length) + Convert.ToString(value).Length;
        if (totalLength < this.MinLength)
        
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        
        return null;
    

y luego podría tener un modelo de vista y decorar una de sus propiedades con él:

public class MyViewModel

    [CombinedMinLength(20, "Bar", "Baz", ErrorMessage = "The combined minimum length of the Foo, Bar and Baz properties should be longer than 20")]
    public string Foo  get; set; 
    public string Bar  get; set; 
    public string Baz  get; set; 

Modelo autovalidado

Su modelo debe implementar una interfaz IValidatableObject. Pon tu código de validación en Validate método:

public class MyModel : IValidatableObject

    public string Title  get; set; 
    public string Description  get; set; 

    public IEnumerable Validate(ValidationContext validationContext)
    
        if (Title == null)
            yield return new ValidationResult("*", new []  nameof(Title) );

        if (Description == null)
            yield return new ValidationResult("*", new []  nameof(Description) );
    

Tenga en cuenta: este es un lado del servidor validación. No funciona en el lado del cliente. Su validación se realizará solo después del envío del formulario.

ExpressiveAnnotations te da esa posibilidad:

[Required]
[AssertThat("Length(FieldA) + Length(FieldB) + Length(FieldC) + Length(FieldD) > 50")]
public string FieldA  get; set; 

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *