asp.net - data - Cómo crear Validadores de Anotación de Datos Personalizados
custom validation data annotation mvc (2)
Para crear un validador de anotación de datos personalizado, siga estas líneas de guides:
- Tu clase debe heredar de la clase
System.ComponentModel.DataAnnotations.ValidationAttribute
. -
bool IsValid(object value)
métodobool IsValid(object value)
e implemente 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. Este suele ser un comportamiento incorrecto, porque eso está en el validador Required
para verificar, lo que significa que sus validadores personalizados solo deberían validar datos que no sean nulos, sino que devuelvan true
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 el validador Required
también, por lo que está en sintonía con la precaución anterior que 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) .
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.
Use 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;
}
}