vista ventajas mvc modelo ejemplos controlador asp.net-mvc-3 fluentvalidation

asp.net-mvc-3 - ventajas - mvc submit button action



FluentValidation-validación a través de múltiples propiedades (2)

Finalmente, funcionó después de que volví a leer la documentation : "Tenga en cuenta que hay una sobrecarga adicional para Must que también acepta una instancia del objeto principal que se está validando".

public class EventModelValidator : AbstractValidator<EventViewModel> { public EventModelValidator() { RuleFor(x => x.StartDate) .NotEmpty().WithMessage("Date is required!") .Must(BeAValidDate).WithMessage("Invalid date"); RuleFor(x => x.StartTime) .NotEmpty().WithMessage("Start time is required!") .Must(BeAValidTime).WithMessage("Invalid Start time"); RuleFor(x => x.EndTime) .NotEmpty().WithMessage("End time is required!") .Must(BeAValidTime).WithMessage("Invalid End time") // new .Must(BeGreaterThan).WithMessage("End time needs to be greater than start time"); RuleFor(x => x.Title).NotEmpty().WithMessage("A title is required!"); } private bool BeAValidDate(string value) { DateTime date; return DateTime.TryParse(value, out date); } private bool BeAValidTime(string value) { DateTimeOffset offset; return DateTimeOffset.TryParse(value, out offset); } // new private bool BeGreaterThan(EventViewModel instance, string endTime) { DateTime start = DateTime.Parse(instance.StartDate + " " + instance.StartTime); DateTime end = DateTime.Parse(instance.EndDate + " " + instance.EndTime); return (DateTime.Compare(start, end) <= 0); } }

Puede haber una forma más limpia / más legant de hacer esto, pero por ahora, funciona bien.

Tener un formulario donde un usuario pueda ingresar la fecha / hora de inicio y la fecha / hora de finalización para un evento. Aquí está el validador hasta ahora:

public class EventModelValidator : AbstractValidator<EventViewModel> { public EventModelValidator() { RuleFor(x => x.StartDate) .NotEmpty().WithMessage("Date is required!") .Must(BeAValidDate).WithMessage("Invalid date"); RuleFor(x => x.StartTime) .NotEmpty().WithMessage("Start time is required!") .Must(BeAValidTime).WithMessage("Invalid Start time"); RuleFor(x => x.EndTime) .NotEmpty().WithMessage("End time is required!") .Must(BeAValidTime).WithMessage("Invalid End time"); RuleFor(x => x.Title).NotEmpty().WithMessage("A title is required!"); } private bool BeAValidDate(string value) { DateTime date; return DateTime.TryParse(value, out date); } private bool BeAValidTime(string value) { DateTimeOffset offset; return DateTimeOffset.TryParse(value, out offset); } }

Ahora también me gustaría agregar la validación de EndDateTime> StartDateTime (propiedades combinadas de Date + Time), pero no estoy seguro de cómo hacerlo.

Edición: para aclarar, necesito combinar de alguna manera EndDate + EndTime / StartDate + StartTime, es decir DateTime.Parse (src.StartDate + "" + src.StartTime) y luego validar EndDateTime vs. StartDateTime. ¿Cómo hago eso?


Podrías intentar usar la regla de GreaterThan :

RuleFor(x => x.EndDate) .GreaterThan(x => x.StartDate) .WithMessage("end date must be after start date");