Question

Je suit la propriété dans mon modèle classe métadonnées:

[Required(ErrorMessage = "Spent On is required")]
[RegularExpression(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]", 
   ErrorMessage = "Please enter date in mm/dd/yyyy format")]
[DataType(DataType.Date)]
[DisplayName("Spent On")]
public DateTime SpentOn { get; set; }

Mais chaque fois que je l'appelle ModelState.IsValid retourne toujours faux, car regex ne valide pas. J'avons identifié la date entrée (29/08/2010) contre les nouveaux regex en utilisant même modèle et correspond parfaitement.

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

C'est parce que regex applique aux chaînes et non des propriétés DateTime. Si l'utilisateur entre une chaîne non valide qui ne peut être analysé à une instance de DateTime du modèle liant, il ajoutera un message d'erreur générique avant votre motif exécute regex.

Vous avez deux possibilités:

  1. Personnaliser le message d'erreur dans un fichier de ressources
  2. Ecrire un liant modèle personnalisé
  3. Utilisez un propriété de chaîne (je me sens coupable de proposer ceci: -))

Autres conseils

il y a un autre actualy solution de contournement pour cela. Vous pouvez simplement sous-classe le RegularExpressionAttribute

public class DateFormatValidatorAttribute : RegularExpressionAttribute {
    public DateFormatValidatorAttribute()
        : base(@"[0-1][0-9]/[0-3][0-9]/20[12][0-9]") 
        {
            ErrorMessage = "Please enter date in mm/dd/yyyy format";
        }

        public override bool IsValid(object value) {
            return true;
        }
}

dans vos Global.asax.cs au démarrage de l'application enregistrer le addapter de RegularExpression pour la validation du côté client comme ceci:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(DateFormatValidatorAttribute), 
                typeof(RegularExpressionAttributeAdapter));

Maintenant, vous devez avoir l'accumulation dans le côté client validateur exression régulière MVC et garder le DateTime comme type de propriété

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top