流利的验证:' DateTime'不包含'价值'的定义

时间:2016-03-21 23:03:48

标签: asp.net asp.net-mvc asp.net-mvc-5 fluentvalidation fluentvalidation-2.0

尝试使用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,如上所述。

1 个答案:

答案 0 :(得分:1)

使用

.GreaterThan(x => x.Report1ToExcelDateFrom)

取代

.GreaterThan(x => x.Report1ToExcelDateFrom.Value)

因为您的模型Report1ToExcelDateFrom不是可以为空的日期时间

public DateTime ? Report1ToExcelDateFrom { get; set; }

会完美地实现