尝试使用Fluent验证以确保始终填写日期范围,并确保结束日期不会在开始日期之前发生。
我正确地完成了第一部分,并且它正确启动,但第二部分似乎无法实现。
我的代码:
public class Report1ToExcelValidator : AbstractValidator<Report1ToExcelViewModel> {
public Report1ToExcelValidator() {
RuleFor(x => x.Report1ToExcelDateFrom)
.NotEmpty().WithMessage("Please provide a valid beginning date for the range.");
RuleFor(x => x.Report1ToExcelDateTo)
.NotEmpty().WithMessage("Please provide a valid end date for the range.")
.GreaterThan(x => x.Report1ToExcelDateFrom.Value).WithMessage("The Date To must be after the Date From");
}
}
一切都被绊倒的是.GreaterThan
,报告错误:
'DateTime' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'DateTime' could be found
我的DateTime不可为空,两个DateTimes都需要内容。当我允许Intellisense提出可能的选项时,字段名称之后的任何内容都限于.Date
和.Hour
之类的内容,这些内容也不起作用。该选项列表中不存在.Value
,.HasValue
也不存在。
真的很困惑这个。
另外,另一个问题是:如何对单个页面上存在的多个表单进行单独验证?现在我只有一个表格,但表格的模型正在直接引入。我似乎无法弄清楚如何抽象出表单的模型,这样我就可以在页面上拥有多个模型。没有数据被带入。
现在我刚尝试将模型改为:
public class ReportViewModel {
public Report1ToExcelViewModel Report1ToExcelViewModel { get; set; }
}
[Validator(typeof(Report1ToExcelValidator))]
public class Report1ToExcelViewModel {
public Guid? Report1ToExcelRegion { get; set; }
public DateTime Report1ToExcelDateFrom { get; set; }
public DateTime Report1ToExcelDateTo { get; set; }
}
页面引用@model CCS.Models.ReportViewModel
而不是@model CCS.Models.Report1ToExcelViewModel
,但我似乎无法获取报表以接收Report1ToExcelViewModel,以便识别表单字段。现在他们错误了,因为'ReportViewModel' does not contain a definition for [fieldname]
即使我将Report1ToExcelViewModel
直接带到ReportViewModel
,如上所述。
答案 0 :(得分:1)
使用
.GreaterThan(x => x.Report1ToExcelDateFrom)
取代
.GreaterThan(x => x.Report1ToExcelDateFrom.Value)
因为您的模型Report1ToExcelDateFrom不是可以为空的日期时间
public DateTime ? Report1ToExcelDateFrom { get; set; }
会完美地实现