2009-11-23 106 views
5

我有一個使用DataAnnotations的模型。類似於DataAnnotations中的ErrorMessage被忽略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; } 
} 

「必需」屬性遵守ErrorMessage中的值;也就是說,如果我沒有輸入數值,我會收到我的「請輸入」消息。但是,如果我在DateTime字段中輸入字符串,則會收到標準系統錯誤消息「值'blah'對於AppointmentDate無效」。

我通過ASP.NET MVC代碼進行調試,並且似乎在FormatException的情況下,它不會從propertyMetadata中選擇正確的顯示名稱。要麼,要麼我錯過了一些明顯的東西:/

有沒有人遇到過這個問題?是我,還是隻是測試版(我正在使用ASP.NET MVC 2 Beta)?

回答

2

在MVC1 DataType屬性沒有做你期望的,它看起來像它不在MVC2中。你最好的電話是有一個代表日期的字符串屬性,檢查它的有效性。

下面是一個項目一個小摘錄(使用DataAnnotations和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); 
      } 
     } 
    } 

它很有意義的,在我們的項目中兩地的檢查,但我只是想告訴你一個概念。

1

我就遇到了這個問題,今天我想分享另一種解決辦法...

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

您需要調整您的代碼字符串,而不是日期時間(大概是容易的工作,如果這是部分您的視圖模型),但錯誤消息按預期工作,並且字符串保證是有效日期(可能有一段時間)。