2011-11-22 3 views
3

Im utilisant DataAnnotations dans une interface d'une classe linq sql. Tout va bien.Expression régulière pour la date ne fonctionnant pas; MVC3 DataAnnotations

Im ayant des problèmes avec les champs de temps de date

Mon code est le suivant:

[DataType(DataType.Date)] 
    [RegularExpression(@"^([1-9]|0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$", ErrorMessage = "regexFail")] 
    DateTime? DateofBirth { get; set; } 

Maintenant, l'expression de type de données fonctionne très bien, il apporte une date plutôt qu'une date heure. Le problème réside dans la validation des champs. Mon regex ne correspond pas aux dates, même si je l'ai mis dans un moteur et c'est le cas. Par exemple je mets "10/10/2010" dans le champ et j'obtiens l'erreur "regexFail". Je suis assez sûr que mon expression est bonne, donc je ne suis pas sûr que ce soit faux.

Merci d'avance.

+0

Est-ce délibérément un format de date de style européen (D/M/Y contre M/D/Y)? – phatfingers

+0

Date australienne – MrJD

Répondre

3

Je pense que ce qui se passe est que la valeur DateTime est convertie en une chaîne, puis appariée au modèle. Si c'est le cas, et que ToString est utilisé, un temps par défaut de 12:00:00 AM sera inclus dans la chaîne correspondant.

J'ai essayé le code suivant et IsValid retourné true:

string pattern = @"^([1-9]|0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d\s12:00:00\sAM$"; 

RegularExpressionAttribute attribute = new RegularExpressionAttribute(pattern) { ErrorMessage = "regexFail" }; 
DateTime dt = new DateTime(2010, 10, 10); 

bool isValid = attribute.IsValid(dt); 
2

Décorer un champ DateTime avec l'attribut [RegularExpression] ne fait aucun sens. Cet attribut est utilisé avec les types de chaîne. Lorsque vous avez une propriété DateTime, le classeur de modèle par défaut utilisera le paramètre de culture actuel pour analyser la valeur de la demande dans un DateTime en supposant qu'il s'agissait d'une requête POST et utilisera le format aaaa-MM-jj s'il s'agissait d'une requête GET. Comme vous pouvez le voir, c'est le classeur de modèle par défaut qui est chargé de convertir la requête HTTP de l'utilisateur en une instance du champ DateTime et le validateur RegularExpression ne joue pas. Par conséquent, si vous souhaitez limiter les dates qu'un utilisateur peut entrer dans un format personnalisé, vous pouvez utiliser un custom model binder pour les dates. La même chose est vraie pour les autres types de valeur tels que les nombres entiers et les doubles.

Questions connexes