2016-06-10 1 views
1

Dans mon application ASP.NET MVC, j'utilise Fluent validation pour valider mon models.Please jeter un oeil à mon modèle:erreur de validation fluent Faux disparaît après IIS redémarrage

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

Et voici la partie de validation couramment :

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"); 

Dans l'ensemble, cela fonctionne très bien, mais en moyenne toutes les 3 semaines j'obtiens cette erreur de validation bien que la valeur du modèle soit correctement entrée. Comme vous pouvez le voir, je compare la partie date du modèle avec la partie date d'aujourd'hui, si une date est saisie. Donc, pas d'heures ou de minutes sont impliqués. J'entre la même information en mode débogage et ne reçois pas cette erreur de validation. Le seul remède est de redémarrer l'IIS. Juste cela suffit pour que le problème disparaisse. Une idée pourquoi?

Répondre

2

Comment instanciez-vous vos validateurs?

Je vous suggère fortement de ne pas référencer DateTime.Now directement dans le constructeur de votre validateur. Si votre validateur est instancié en tant que singleton (ce que l'intégration MVC par défaut fera pour des raisons de performances), la valeur de DateTime.Now finit par être également mise en cache, de sorte que vous obtiendrez des résultats bizarres.

Vous devez invoquer cette lazily- utiliser la surcharge de LessThanOrEqualTo qui prend un Func [T] au lieu:

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

... ou utiliser un régnerez à la place:

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

Cette De la même façon, la valeur de DateTime.Now est recherchée chaque fois que le validateur est appelé, plutôt que le DateTime.Now présent lors de la création de l'objet.

+0

Oui l'instanciation est singleton. Mais ce que je suis curieux de savoir, c'est si la mise en cache est la raison, alors cela ne devrait-il pas arriver tous les jours car la date mise en cache aujourd'hui sera déjà dépassée demain? Et quand vous dites que vous suggéreriez de ne pas faire référence à DateTime.Now directement dans le validateur, où me suggérez-vous de le faire? –

+0

Quand j'ai dit ne pas référencer DateTime.Now directement, je voulais dire le référencer paresseusement en utilisant un func comme dans l'exemple. –