IIS重启后,虚假的流畅验证错误消失了

时间:2016-06-10 06:01:13

标签: asp.net-mvc datetime fluentvalidation

在我的ASP.NET MVC应用程序中,我使用Fluent验证来验证我的模型。请看一下我的模型:

[Table("INWARDDOCUMENTS")]
public class InwardDocument{
    .......................
    [Column("DOCDATE")]
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}"),Display(Name="Document date")]
    public DateTime? DocDate { get; set; }
    ........................
}

这里是流畅的验证部分:

 RuleFor(doc => doc.InwardDocument.DocDate.Value.Date).LessThanOrEqualTo(DateTime.Now.Date).When(x=>x.InwardDocument.DocDate!=null).WithMessage("Document date cannot be greater than the current date");

总的来说它工作正常,但平均每3周我会得到此验证错误,尽管正确输入了模型值。如您所见,如果输入日期,我会将模型的日期部分与今天的日期部分进行比较。所以不涉及小时或分钟。我在调试模式下输入相同的信息,但没有收到此验证错误。唯一的办法就是重启IIS。这就足以让问题消失。知道为什么吗?

1 个答案:

答案 0 :(得分:2)

您如何实例化验证器?

我强烈建议您不要直接在验证程序的构造函数中引用DateTime.Now。

如果您的验证器被实例化为单例(默认MVC集成将出于性能原因),那么DateTime.Now的值最终也会被缓存,因此您最终会得到奇怪的结果。

你需要懒惰地调用它 - 使用LessThanOrEqualTo的重载代替Func [T]:

RuleFor(x => x.whatever).LessThanOrEqual(x => DateTime.Now.Date);

...或者改为使用必须规则:

RuleFor(x => x.whatever).Must(val => val <= DateTime.Now.Date); 

这样,每次调用验证器时都会查找DateTime.Now的值,而不是在创建对象时保持的DateTime.Now。