【问题标题】:False fluent validation error goes away after IIS restartIIS 重新启动后,错误的流利验证错误消失
【发布时间】:2016-06-10 22:28:07
【问题描述】:

在我的 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。这足以让问题消失。知道为什么吗?

【问题讨论】:

    标签: asp.net-mvc datetime fluentvalidation


    【解决方案1】:

    您如何实例化您的验证器?

    我强烈建议您不要直接在验证器的构造函数中引用 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 的值。

    【讨论】:

    • 是的,实例化是单例的。但是我很好奇的是,如果缓存是原因,那么这不应该每天都发生吗,因为今天缓存的日期明天就已经过时了?当你说你建议不要直接在验证器中引用 DateTime.Now 时,你建议我在哪里做?
    • 当我说不要直接引用 DateTime.Now 时,我的意思是像示例中那样使用 func 懒惰地引用它。
    猜你喜欢
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多