2011-10-09 55 views
26

Tiene un formulario donde un usuario puede ingresar la fecha/hora de inicio y la fecha/hora de finalización de un evento. Aquí está el validador hasta ahora:FluentValidation: validación en propiedades múltiples

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 añadir que la validación EndDateTime> (propiedades combinado fecha + hora) StartDateTime, pero no sabe cómo hacerlo.

Editar: Para aclarar, necesito alguna manera de combinar EndDate + EndTime/StartDate + Hora de inicio es decir DateTime.Parse (src.StartDate + "" + src.StartTime) y luego validar EndDateTime vs StartDateTime - cómo hacer ¿Yo hago eso?

Respuesta

33

Finalmente consiguió poner en funcionamiento después de volver a leer el documentation: "Tenga en cuenta que hay una sobrecarga adicional por No se lo que también acepta una instancia de la el objeto padre está siendo validado ".

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 para hacer esto, pero por ahora, es WORKSFORME.

+0

¿Es posible hacer el mismo lado del cliente? – SMC

+0

Esto ya no es válido en FluentValitation. Esta es la respuesta correcta: http://stackoverflow.com/a/20546097/59119 – Natrium

14

Usted podría podría tratar de usar la regla GreaterThan:

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

Lo siento, acabo de agregar una aclaración anterior. Necesita combinar Fecha + Hora y ** luego ** validar – seekay

+0

¿Es posible hacer el mismo lado del cliente? o verifique aquí http://stackoverflow.com/questions/18142489/how-to-validate-date-in-clientside-using-fluentvalidation – SMC

Cuestiones relacionadas