有一个用户可以输入事件的开始日期/时间和结束日期/时间的表单。到目前为止,这是验证器:
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(组合日期时间属性),但不知道如何去做。
编辑:
为了澄清,我需要以某种方式结合EndDate EndTime / StartDate StartTime即DateTime.Parse(src.StartDate“”src.StartTime),然后验证EndDateTime与StartDateTime – 我该怎么做?
解决方法
在我重新读取
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 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); } }
这可能是一个更清洁/更有条理的方法,但现在它可以工作。