Cómo crear validadores de anotaciones de datos personalizados

Resuelto SamWM asked hace 14 años • 3 respuestas

Querer crear una validación de anotaciones de datos personalizada. ¿Existen guías/muestras útiles sobre cómo crearlas?

En primer lugar:
StringLength con longitud mínima y máxima. Soy consciente de que .NET 4 puede hacer esto, pero quiero hacer lo mismo en .NET 3.5, si es posible, pudiendo definir solo la longitud mínima (al menos x caracteres), solo la longitud máxima (hasta x caracteres) o ambas. (entre caracteres x e y).

En segundo lugar:
Validación usando módulo aritmético: si el número tiene una longitud válida, deseo validar usando el algoritmo Módulo 11 (ya lo implementé en JavaScript, así que supongo que sería simplemente una simple transferencia).

Actualización:
Resuelto el segundo problema, fue solo un caso de copiar la implementación de JavaScript y hacer algunos ajustes, así que no necesito una solución para eso.

SamWM avatar Aug 05 '10 17:08 SamWM
Aceptado

Para crear un validador de anotaciones de datos personalizado, siga estas pautas:

  1. Tu clase tiene que heredar de System.ComponentModel.DataAnnotations.ValidationAttributela clase.
  2. Anule bool IsValid(object value)el método e implemente la lógica de validación dentro de él.

Eso es todo.

Precaución IMPORTANTE

A veces, los desarrolladores verifican que el valor no sea nulo o esté vacío y devuelven falso. Este suele ser un comportamiento incorrecto, porque está en Requiredel validador para verificarlo, lo que significa que sus validadores personalizados solo deben validar datos que no sean nulos, pero devolver truelo contrario (ver ejemplo). Esto los hará utilizables en campos obligatorios (obligatorios) y no obligatorios.

Ejemplo

public class StringLengthRangeAttribute : ValidationAttribute
{
    public int Minimum { get; set; }
    public int Maximum { get; set; }

    public StringLengthRangeAttribute()
    {
        this.Minimum = 0;
        this.Maximum = int.MaxValue;
    }

    public override bool IsValid(object value)
    {
        string strValue = value as string;
        if (!string.IsNullOrEmpty(strValue))
        {
            int len = strValue.Length;
            return len >= this.Minimum && len <= this.Maximum;
        }
        return true;
    }
}

Todas las propiedades se pueden configurar en el atributo como desee configurarlas.
Algunos ejemplos:

[Required]
[StringLengthRange(Minimum = 10, ErrorMessage = "Must be >10 characters.")]

[StringLengthRange(Maximum = 20)]

[Required]
[StringLengthRange(Minimum = 10, Maximum = 20)]

Cuando una propiedad particular no está establecida, su valor se establece en el constructor, por lo que siempre tiene un valor. En los ejemplos de uso anteriores también agregué deliberadamente el Requiredvalidador, por lo que está sincronizado con la precaución anterior que escribí.

Importante

Entonces, este validador seguirá funcionando con el valor de su modelo que no es obligatorio, pero cuando está presente lo valida (piense en un campo de texto en un formulario web, eso no es obligatorio, pero si un usuario ingresa un valor, tiene que ser válido). .

Robert Koritnik avatar Aug 05 '2010 10:08 Robert Koritnik

Utilice CustomValidationAttributejunto con una función de validación con firma.

public static ValidationResult Validate(MyType x, ValidationContext context)

Ejemplo (para una propiedad de cadena)

using System.ComponentModel.DataAnnotations;

public class MyClass
{
    [CustomValidation(typeof(MyClass), "Validate")]
    public string MyProperty { get; set; }

    public static ValidationResult Validate(string x, ValidationContext context)
    {
        return (x == "valid")
            ? new ValidationResult(null)
            : ValidationResult.Success;
    }
}
Micha Wiedenmann avatar Jul 13 '2017 09:07 Micha Wiedenmann