2011-10-09 13 views
26

イベントの開始日時と終了日時を入力できるフォームがあります。FluentValidation - 複数のプロパティにわたる検証

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

    } 

今、私はまた、検証EndDateTime> StartDateTime(組み合わせる日付+時刻のプロパティ)を追加したいのですが、それについて移動する方法がわからない:ここでバリデータは今のところです。

編集: 明確にするために、私は何とか終了日+終了時間/開始日+のStartTimeすなわちDateTime.Parse(src.StartDate + "" + src.StartTime)を組み合わせ、その後、StartDateTime対EndDateTimeを検証する必要があります - どのように行います私がする?

答えて

33

は、最後にそれは私が後に再読み込みdocumentationを働いてしまった:「ものインスタンスを受け入れなければならないため、追加のオーバーロードがあることに注意してください親オブジェクトが検証されています。

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

は、これを行うためのクリーナー/もっとlegantな方法があるかもしれませんが、今のところ、それはWORKSFORME。

+0

同じクライアント側を行うことは可能ですか? – SMC

+0

これはFluentValitationでは無効です。これは正しい答えです:http://stackoverflow.com/a/20546097/59119 – Natrium

14

あなたはGreaterThanルールを使用して試みることができることができます:

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

申し訳ございませんが、上記の説明を追加しました。 Date + Timeと** then ** validateを組み合わせる必要があります – seekay

+0

同じクライアント側を行うことは可能ですか?ここで確認してくださいhttp://stackoverflow.com/questions/18142489/how-to-validate-date-in-clientside-using-fluentvalidation – SMC

関連する問題