2009-11-23 7 views
5

J'ai un modèle qui utilise DataAnnotations. Quelque chose commeErrorMessage est ignoré dans DataAnnotations Attribut DataType

public class Appointment { 
    [Required(ErrorMessage="Please enter your name")] 
    public string Name { get; set; } 

    [Required(ErrorMessage="Please enter your appointment date?")] 
    [DataType(DataType.Date, ErrorMessage="Appointment date is not a date")] 
    public DateTime AppointmentDate { get; set; } 
} 

Les attributs « obligatoires » respectent la valeur ErrorMessage; c'est-à-dire, si je ne saisis pas de valeur, je reçois mon message "veuillez entrer". Toutefois, si j'entre une chaîne dans le champ DateTime, j'obtiens un message d'erreur système standard "La valeur 'blah' n'est pas valide pour AppointmentDate".

J'ai débogué via le code ASP.NET MVC, et il semble que dans le cas de FormatException, il ne sélectionne pas le bon nom d'affichage de propriétéMetadata. Soit ça, ou il me manque quelque chose de façon flagrante:/

Est-ce que quelqu'un a rencontré ce problème? Est-ce moi, ou est-ce juste bêta (j'utilise ASP.NET MVC 2 Beta)?

Répondre

2

Dans MVC1, l'attribut DataType ne fait pas ce que vous attendez, il semble que ce ne soit pas non plus dans MVC2. Votre meilleur appel est d'avoir une propriété de chaîne représentant la date, vérifiez sa validité ici.

Voici un petit extrait d'un projet (en utilisant DataAnnotations et xVal):

private List<ErrorInfo> _errors; 
     private List<ErrorInfo> Errors 
     { 
      get 
      { 
       if (_errors == null) 
        _errors = new List<ErrorInfo>(); 
       return _errors; 
      } 
      //set { _errors = value; } 
     } 

private string _startDateTimeString; 

     /// <summary> 
     /// A string reprsentation of the StartDateTime, used for validation purposes in the views. 
     /// </summary> 
     /// <remarks> 
     /// If the user passes something like 45/45/80 it would be a valid mm/dd/yy format, but an invalid date, 
     /// which would cause an InvalidOperationException to be thrown by UpdateModel(). By assigning dates to string properties 
     /// we can check not only the format, but the actual validity of dates. 
     /// </remarks> 
     public string StartDateTimeString 
     { 
      get 
      { 
       return _startDateTimeString; 
      } 
      set 
      { 
       // Check whether the start date passed from the controller is a valid date. 
       DateTime startDateTime; 
       bool validStartDate = DateTime.TryParse(value, out startDateTime); 
       if (validStartDate) 
       { 
        StartDateTime = startDateTime; 
       } 
       else 
       { 
        Errors.Add(new ErrorInfo("StartDateTime", "Provide a valid date for the start time.")); 
       } 

       _startDateTimeString = value; 
      } 
     } 

     partial void OnValidate(ChangeAction action) 
     { 
      if (action != ChangeAction.Delete) 
      { 
       Errors.AddRange(DataAnnotationsValidationRunner.GetErrors(this)); 

       if (StartDateTimeString != null) 
       { 
        DateTime startDateTime; 
        if (!DateTime.TryParse(StartDateTimeString, out startDateTime)) 
        { 
         Errors.Add(new ErrorInfo("StartDateTime", "Provide a valid date for the start time.")); 
        } 
       } 

       if (Errors.Any()) 
        throw new RulesException(Errors); 
      } 
     } 
    } 

Il est logique d'avoir le contrôle dans les deux endroits dans notre projet, mais je veux juste vous montrer un concept.

1

Je suis tombé sur ce problème aujourd'hui et je voulais partager une autre solution ...

[Required(ErrorMessage="Please enter your appointment date?")] 
//[DataType(DataType.Date, ErrorMessage="Appointment date is not a date")] 
[Range(typeof(DateTime), "1/1/1880", "1/1/2200", ErrorMessage = "...")] 
public string AppointmentDate { get; set; } 

Vous devrez ajuster votre code pour travailler avec une chaîne au lieu d'un datetime (probablement facile si cela fait partie de votre modèle de vue), mais le message d'erreur fonctionne comme prévu et la chaîne est garantie d'être une date valide (éventuellement avec un temps).

Questions connexes