see*_*kay 31 fluentvalidation asp.net-mvc-3
有一个表单,用户可以在其中输入事件的开始日期/时间和结束日期/时间.到目前为止,这是验证器:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我还想添加EndDateTime> StartDateTime(组合日期+时间属性)的验证,但不知道如何去做.
编辑: 为了澄清,我需要以某种方式结合EndDate + EndTime/StartDate + StartTime即DateTime.Parse(src.StartDate +""+ src.StartTime),然后验证EndDateTime与StartDateTime - 我该怎么做?
see*_*kay 38
最后,在我重新阅读文档之后,它已经工作了:"请注意,Must还有一个额外的重载,它还接受正在验证的父对象的实例."
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);
}
}
Run Code Online (Sandbox Code Playgroud)
可能有更清洁/更健全的方法来做到这一点,但就目前而言,它的工作原理.
Dar*_*rov 16
您可以尝试使用该GreaterThan规则:
RuleFor(x => x.EndDate)
.GreaterThan(x => x.StartDate)
.WithMessage("end date must be after start date");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16316 次 |
| 最近记录: |