2010-05-02 4 views
1
[Required(ErrorMessage = "Date is required")] 
[RegularExpression(@"^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$", ErrorMessage="Date is not valid must be like (dd/mm/jjjj)")] 
public DateTime Startdate{ get; set;} 

La validation côté client fonctionne parfaitement. Il semble donc que JavaScript puisse comprendre avec succès mon expression régulière. Mais quand je fais une publication, et le modelstate.Isvalid() est appelé.ASP MVC 2: Attribut d'expression régulière fonctionnant sur le client mais pas sur le serveur

Ma date n'est plus valide. Donc, je suppose que lorsque .NET effectue la correspondance avec le regEx, il ne correspond pas.

Ma question: Pourquoi cette expression régulière correspond-elle du côté client mais pas côté serveur?

Répondre

2

Cela est dû au fait que la publication de la publication est prioritaire et qu'elle ne peut pas analyser la valeur de DateTime. Par ailleurs, ce n'est pas une bonne idée de mettre l'attribut RegularExpression sur la classe DateTime. Il a le code suivant

public override bool IsValid(object value) 
{ 
    string str = Convert.ToString(value, CultureInfo.CurrentCulture); 
    if (string.IsNullOrEmpty(str)) 
    { 
     return true; 
    } 
    Match match = this.Regex.Match(str); 
    return ((match.Success && (match.Index == 0)) && (match.Length == str.Length)); 
} 

si Convert.ToString (valeur, CultureInfo.CurrentCulture) ne correspondra jamais à votre regex, becouse il aura une partie de temps aussi.

Vous devriez mieux utiliser String au lieu de datetime.

0

Je pense que si vous voulez vérifier l'expression régulière, vous devez utiliser:

public string Startdate{ get; set;} 

et puis le convertir en DateTime côté serveur, après modèle de liaison. Vous savez que cette date doit être fournie dans un format spécifique, mais le classeur de modèle n'est pas très intelligent et génère une erreur. Si vous avez DateTime après la liaison du modèle, il n'y a aucun sens à le vérifier par l'expression régulière, n'est-ce pas? La liaison du modèle vient en premier, puis la validation.

0

Est-il possible que les règles de validation côté client ne soient pas réellement appliquées? Avez-vous vérifié que l'attribut requis fonctionne comme prévu? Vous devriez être en mesure d'utiliser firebug pour vérifier que l'expression régulière est la même côté serveur, que toutes les valeurs sont comme attendu, etc.

De même, il se peut que la valeur insérée passe l'expression régulière, mais toujours ne peut pas être converti en datetime par le classeur du modèle - cela produirait également une erreur de modèle.

Je n'ai pas vérifié votre regex pour voir ce qu'il fait vraiment, mais si vous essayez de vérifier que l'entrée est une date valide, utilisez plutôt le DataTypeAttribute.

+0

J'ai essayé datatypeAttribute, il ne valide pas du tout. Je lis aussi sur internet qu'il n'est pas fait pour la validation. –

Questions connexes