2013-02-13 32 views
1

我有以下的定製驗證屬性代碼調用日期範圍:驗證歸因緩存

private DateTime _minDate = DateTime.Today.AddYears(-100); 
    private DateTime _maxDate = DateTime.MaxValue; 

    // String representation of the Min Date (yyyy/MM/dd) 
    public string Min 
    { 
     get { return FormatDate(_minDate, DateTime.Today.AddYears(-100)); } 
     set { _minDate = value == "Today" ? DateTime.Today : ParseDate(value, DateTime.Today.AddYears(-100)); } 
    } 
    // String representation of the Max Date (yyyy/MM/dd) 
    public string Max 
    { 
     get { return FormatDate(_maxDate, DateTime.MaxValue); } 
     set { _maxDate = value == "Today" ? DateTime.Today : ParseDate(value, DateTime.MaxValue); } 
    } 

然後我寫這樣的實體模型的某些屬性在元數據中該屬性:

[DateRange(Max = "Today")] 
public string SomeDateProperty { get; set; }; 

我設置Max屬性的getter斷點。我第一次打開視圖,斷點被激活,並獲得DateTime.Today。因此,視圖的刷新不會激活斷點並獲得舊值。我認爲它是緩存驗證屬性。我的問題是:這是因爲緩存嗎?如果是這樣,那麼如何禁用它呢?在此先感謝

+0

有關於此的更多信息?我們遇到了同樣的問題。 – 2013-09-25 08:23:17

回答

1

自定義屬性的構造函數只被命中一次,不知道如何關閉任何類型的緩存。我爲我的場景得出的結論是隻處理「IsValid」方法中的日期計算。

我在過去屬性中創建了一個日期,它需要過去的日期,但是您可以設置過去有效的時間。

public class DateInPastAttribute : ValidationAttribute 
{ 
    private const string DefaultErrorMessage = "'{0}' must be in the past."; 

    public int DaysInPastAllowed { get; set; } 

    public DateInPastAttribute(int daysInPastAllowed) 
     : base(DefaultErrorMessage) 
    { 
     this.DaysInPastAllowed = daysInPastAllowed; 
    } 

    public override bool IsValid(object value) 
    { 
     if (!(value is DateTime)) 
     { 
      return true; 
     } 

     DateTime maxDate = DateTime.Now; 
     DateTime minDate = maxDate.AddDays(this.DaysInPastAllowed * -1); 

     DateTime dateValue = (DateTime)value; 
     return 
      minDate <= dateValue && 
      dateValue <= maxDate; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return string.Format(CultureInfo.CurrentCulture, this.ErrorMessageString, name); 
    } 
} 

然後可以使用它在您的視圖模型是這樣的:

[DateInPast(365)] 
public DateTime DateReceived { get; set; } 

這將允許日期的最後一年內進入。您可以根據需要修改此方案。