2009-11-23 1 views
5

Ich habe ein Modell, das DataAnnotations verwendet. Etwas wieErrorMessage wird in DataAnnotations DataType-Attribut ignoriert

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; } 
} 

Die Attribute "Required" respektieren den Wert in ErrorMessage; Das heißt, wenn ich keinen Wert eingebe, erhalte ich die Nachricht "Bitte eingeben". Wenn ich jedoch eine Zeichenfolge in das DateTime-Feld eingeben, erhalte ich eine Standardsystemfehlermeldung "Der Wert 'blah' ist nicht gültig für AppointmentDate".

Ich debuggte über ASP.NET MVC-Code, und es scheint, dass im Fall von FormatException nicht den richtigen Anzeigenamen aus propertyMetadata auswählen. Entweder das, oder mir fehlt etwas offensichtlich Offensichtliches:/

Ist jemand in dieses Problem gerannt? Ist es mir oder ist es nur Beta (ich benutze ASP.NET MVC 2 Beta)?

Antwort

2

In MVC1 DataType-Attribut nicht tun, was Sie erwarten, es sieht aus wie es nicht in MVC2 auch nicht. Am besten rufen Sie eine String-Eigenschaft auf, die das Datum darstellt. Überprüfen Sie dort, ob es gültig ist.

Hier ist ein kleiner Auszug aus einem Projekt (DataAnnotations und xVal verwenden):

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

es Sinn, die Kontrolle in beiden Orten in unserem Projekt haben macht, aber ich möchte nur ein Konzept zeigen.

1

ich in dieses Problem lief heute und ich wollte eine andere Abhilfe teilen ...

[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; } 

Sie müssen Ihren Code anpassen mit einem String statt eines Datetime arbeiten (vermutlich einfach, wenn dieser Teil Ihres View-Modells), aber die Fehlermeldung funktioniert wie erwartet und die Zeichenfolge ist garantiert ein gültiges Datum (möglicherweise mit einer Uhrzeit).