Validación del modelo MVC para la fecha

¿Hay alguna validación por defecto para MVC 5 donde puedo establecer el valor mínimo y máximo de la fecha?

En mi modelo, quiero validación de fecha

public class MyClass { [Required(ErrorMessage="Start date and time cannot be empty")] //validate:Must be greater than current date [DataType(DataType.DateTime)] public DateTime StartDateTime { get; set; } [Required(ErrorMessage="End date and time cannot be empty")] //validate:must be greater than StartDate [DataType(DataType.DateTime)] public DateTime EndDateTime { get; set; } } 

Ps: Según este sitio web de Asp.Net , hay un problema al usar el validador de Range para DateTime, y no se recomienda.

Nota: la validación de jQuery no funciona con el atributo de rango y DateTime. Por ejemplo, el siguiente código siempre mostrará un error de validación del lado del cliente, incluso cuando la fecha está en el rango especificado:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

Deberá deshabilitar la validación de fecha de jQuery para usar el atributo de rango con DateTime. En general, no es una buena práctica recostackr fechas difíciles en sus modelos, por lo que no se recomienda utilizar el atributo de rango y DateTime.

También sé que existen paquetes de Nuget como Fluent Validation y Foolproof que hacen el truco para validar y verificar si una fecha es mayor que otras, pero quería saber si de manera predeterminada hay algo para verificar el valor mínimo y máximo de la fecha.

De lo que vi en MaxLength MinLength new en MVC 5.1 , hay soporte para MaxLength y MinLength Validación.

No es necesario deshabilitar la validación de fecha de jQuery (y es probable que cause otros problemas). Solo necesita anular el método de range del $.validator .

De forma predeterminada, funciona con valores numéricos (y luego vuelve a una comparación de cadenas), por lo que puede agregar el siguiente script (después de jquery.validate.js y jquery.validate.unobtrusive.js , pero no jquery.validate.unobtrusive.js en $(document).ready

 $.validator.methods.range = function(value, element, param) { if ($(element).attr('data-val-date')) { var min = $(element).attr('data-val-range-min'); var max = $(element).attr('data-val-range-max'); var date = new Date(value).getTime(); var minDate = new Date(min).getTime(); var maxDate = new Date(max).getTime(); return this.optional(element) || (date >= minDate && date < = maxDate); } // use the default method return this.optional( element ) || ( value >= param[ 0 ] && value < = param[ 1 ] ); }; 

Luego puede usar RangeAttribute en su propiedad

 [Range(typeof(DateTime), "1/1/1966", "1/1/2020")] public DateTime Date { get; set; } 

IValidatableObject esto con la interfaz IValidatableObject de System.ComponentModel.DataAnnotations, que te permite agregar reglas de validación adicionales donde puedes hacer más comprobaciones. Agregue la interfaz a su clase y luego implemente el método Validate , donde puede comparar StartDateTime con la fecha / hora actual, y también comparar EndDateTime con StartDateTime, por ejemplo

 public class MyClass : IValidatableObject { [Required(ErrorMessage="Start date and time cannot be empty")] //validate:Must be greater than current date [DataType(DataType.DateTime)] public DateTime StartDateTime { get; set; } [Required(ErrorMessage="End date and time cannot be empty")] //validate:must be greater than StartDate [DataType(DataType.DateTime)] public DateTime EndDateTime { get; set; } public IEnumerable Validate(ValidationContext validationContext) { List results = new List(); if (StartDateTime < DateTime.Now) { results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"})); } if (EndDateTime <= StartDateTime) { results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"})); } return results; } } 

El único inconveniente potencial de esto es que Validate ejecuta en el lado del servidor, no en la validación jQuery.

Normalmente uso esta solución cuando quiero validar algo en el servidor. Sé que puede confiar en el Modelo de validación que utiliza MVC, pero cuando realizo las validaciones, estoy tratando de usar un proyecto separado en caso de que necesite hacer una prueba unitaria para ellos. Digamos que tiene dos aplicaciones, una computadora de escritorio y una web, luego ambas pueden compartir el ValidationProject en lugar de repetir el código en ambas aplicaciones para la misma “Vista” / “Pantalla”. La idea aquí es aislar el Proyecto de Validación como un proyecto independiente de su solución.

Para que pueda descargar el proyecto FluentValidation desde NuGet, FluentValidation usa Rules dentro del constructor, puede ver la documentación aquí https://github.com/JeremySkinner/FluentValidation/wiki

Su regla de fecha se puede usar de esta manera, por ejemplo, allí puede poner reglas para su valor mínimo y su valor máximo también:

 public class CustomerValidator: AbstractValidator { public CustomerValidator() { RuleFor(customer => customer.startDate) .NotNull() .WithMessage("You should select a start date") .Must(d => d.HasValue && d.Value < = DateTime.Today) .WithMessage("The start date should not be greather than current month/year"); } 

Ahora dentro de tu controlador

 [HttpPost] public ActionResult Index(Customer c) { if(ModelState.IsValid) { var validator= new CustomerValidator(); var valResult = validator.Validate(c); if (valResult.Errors.Count != 0) { valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage)); return View(vm); } //Your code here } } 

Creo que solo agregar el atributo “Rango” funcionará

 [Range(typeof(DateTime), "01/01/1900", "06/06/2079", ErrorMessageResourceType = typeof(Resources.Patient), ErrorMessageResourceName = "DateOfBirth_Range")]