在我的 ASP.NET MVC应用程序中,我使用Fluent Validation来验证我的模型。请看一下我的模型:
[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。只要这样就足以让问题消失。知道为什么吗?
你如何实例化你的验证器?
我强烈建议你不要直接在验证器的构造函数中引用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 值。