Pregunta Cómo crear Validadores de Anotación de Datos Personalizados


Querer crear una validación de anotación de datos personalizada. ¿Hay alguna guía / muestra útil sobre cómo crearlos?

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, definir solo la longitud mínima (al menos x caracteres), la longitud máxima solamente (hasta x caracteres) o ambos (entre x y y caracteres).

En segundo lugar:
Validación usando la aritmética de módulo: si el número es una longitud válida, deseo validar usando el algoritmo de Modulo 11 (ya lo he implementado en JavaScript, ¿entonces supongo que sería una simple transferencia?)

Actualizar:
El segundo problema resuelto fue simplemente una copia de la implementación de JavaScript y algunos ajustes, por lo que no es necesario encontrar una solución.


34
2017-08-05 10:13


origen


Respuestas:


Para crear un validador de anotación de datos personalizado, siga estas líneas de guides:

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

Eso es.

IMPORTANTE Precaución

A veces los desarrolladores comprueban que el valor no es nulo / vacío y devuelve falso. Esto es generalmente comportamiento incorrecto, porque eso está en Required validador para verificar, lo que significa que sus validadores personalizados solo deben validar datos que no son nulos, pero devuelven true de lo 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 establecer en el atributo que desee configurar.
Algunos ejemplos:

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

[StringLengthRange(Maximum = 20)]

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

Cuando una propiedad en particular no está configurada, su valor se establece en el constructor, por lo que siempre tiene un valor. En los ejemplos de uso anteriores, agregué deliberadamente Required validador también, por lo que está sincronizado con el anterior precaución He escrito.

Importante

Entonces este validador funcionará en el valor de su modelo que no es necesario, 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, debe ser válido) .


80
2017-08-05 10:39



Utilizar el CustomValidationAttribute junto 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;
    }
}

1
2017-07-13 09:07