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");