Cómo crear validadores de anotaciones de datos personalizados
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.
Para crear un validador de anotaciones de datos personalizado, siga estas pautas:
- Tu clase tiene que heredar de
System.ComponentModel.DataAnnotations.ValidationAttribute
la clase. - 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 Required
el validador para verificarlo, lo que significa que sus validadores personalizados solo deben validar datos que no sean nulos, pero devolver true
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 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 Required
validador, 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). .
Utilice 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;
}
}