side net mvc for data custom bootstrap attribute asp annotation asp.net-mvc-2 validation model-validation

asp.net-mvc-2 - net - mvc required field validation



El validador de regex de validaciĆ³n de modelo MVC 2 de ASP.Net falla (2)

Tengo la siguiente propiedad en mi clase de Metadatos Modelo:

[Required(ErrorMessage = "Spent On is required")] [RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", ErrorMessage = "Please enter date in mm/dd/yyyy format")] [DataType(DataType.Date)] [DisplayName("Spent On")] public DateTime SpentOn { get; set; }

Pero cada vez que llamo a ModelState.IsValid siempre devuelve falso porque regex no valida. He igualado la fecha ingresada (29/08/2010) con la nueva expresión regular usando el mismo patrón y coincide perfectamente.

¿Qué estoy haciendo mal?


En realidad, hay otra solución para esto. Simplemente puede subclase el RegularExpressionAttribute

public class DateFormatValidatorAttribute : RegularExpressionAttribute { public DateFormatValidatorAttribute() : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") { ErrorMessage = "Please enter date in mm/dd/yyyy format"; } public override bool IsValid(object value) { return true; } }

en su Global.asax.cs en el inicio de la aplicación, registre el addapter RegularExpression para la validación del lado del cliente de la siguiente manera:

DataAnnotationsModelValidatorProvider.RegisterAdapter( typeof(DateFormatValidatorAttribute), typeof(RegularExpressionAttributeAdapter));

Ahora tienes que tener el lado del cliente del validador regular MVC incorporado y mantener el DateTime como tu tipo de propiedad


Esto se debe a que la expresión regular se aplica a las cadenas y no a las propiedades de DateTime . Si el usuario ingresa una cadena no válida que no se puede analizar en una instancia de DateTime desde la carpeta de modelo, agregará un mensaje de error genérico antes de que se ejecute su patrón de expresión regular.

Tienes un par de posibilidades:

  1. Personalice el mensaje de error en un archivo de recursos
  2. Escribir un archivador de modelo personalizado
  3. Use una propiedad de cadena (me siento culpable por proponer esto :-))