2016-06-10 55 views
1

后,在我的ASP.NET MVC应用程序,我用流利的验证来验证我的models.Please看看我的模型:假流利的验证错误消失IIS重新启动

[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。这足以让问题消失。任何想法为什么?

回答

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。

+0

是的实例化是单例。但我很好奇的是,如果缓存是原因,那么不应该每天都这样做,因为今天缓存的日期明天已经过时了。而当你说你会建议不''直接在验证器中引用DateTime.Now时,你建议我在哪里做? –

+0

当我说不直接引用DateTime.Now时,我的意思是使用一个func来引用它,如示例中所示。 –