2009-11-25 21 views
0
public class Dinner 
    { 
     public string ID { get; set; } 
     public string Title { get; set; } 
     public Category Category { get; set; } 
     public DateTime? DateCreated { get; set; } 
    } 

該類(重要部分)模型視圖是DataAnnotations

public class DinnerModelView 
    { 
     ... 
     [UIHint("DatePicker")] 
     [DateTime(ErrorMessage = "Invalida date")] 
     public DateTime? DateCreated { get; set; } 
    } 

哪裏DateTimeAttriburte是

public class DateTimeAttribute : ValidationAttribute 
    { 
     public DateTimeAttribute() : base (() => "Invalid date") { } 
     public DateTimeAttribute(string errorMessage) : base(() => errorMessage) { } 
     public override bool IsValid(object value) 
     { 
      if (value == null) 
       return true; 

      bool isValid = false; 
      if (value is DateTime) 
       isValid = true; 

      DateTime tmp; 
      if (value is String) 
      { 
       if(String.IsNullOrEmpty((string)value)) 
        isValid = true; 
       else 
        isValid = DateTime.TryParse((string)value, out tmp); 
      } 

      return isValid; 
     } 
    } 

但是模型狀態錯誤仍然說「值 'XXXX' 是無效的創建日期。」 我無法替換此消息。爲什麼?

+0

ValidationAttribute的類型是什麼?您將一個lambda傳遞給基本ctor,但DataAnnotations ValidationAttribute沒有這樣的ctor。 – Haacked 2009-11-25 18:00:59

+0

我正在使用mvc 2附帶的數據註釋程序集。以下是ValidationAttribute的構造函數: protected ValidationAttribute(); protected ValidationAttribute(Func errorMessageAccessor); protected ValidationAttribute(string errorMessage); – 2009-11-26 08:03:24

回答

0

看起來,因爲DateCreated屬性的類型爲DateTime,所以MVC在檢查DateTimeAttribute之前會以某種方式驗證它,從而永遠不會收到您的自定義錯誤消息。

如果您將DateCreated更改爲字符串,它可能會工作。但是因爲您必須將值保存到數據庫中,所以您不想更改DateCreated類型。因此,您可以創建一個名爲DateCreatedStr的新屬性,並讓用戶將數據類型轉換爲此屬性。在保存數據之前,您可以將(驗證的)數據從DateCreatedStr移動到DateCreated。

我知道這不是一個很好的方式來做到這一點,但它的工作原理!