3

DateRangeというカスタム検証属性に次のコードがあります。

    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プロパティのゲッターにブレークポイントを設定しました。初めてビューを開くと、ブレークポイントがアクティブになり、DateTime.Todayが取得されます。結果としてビューを更新してもブレークポイントはアクティブにならず、古い値が取得されます。キャッシュ検証属性だと思います。私の質問は:これはキャッシングのせいですか?もしそうなら、それを無効にする方法は?前もって感謝します

4

1 に答える 1

2

カスタム属性のコンストラクターは一度しかヒットせず、あらゆる種類のキャッシュをオフにする方法がわかりません。私のシナリオでこれを回避した方法は、「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; }

これにより、過去 1 年以内の日付を入力できます。必要なシナリオに合わせてこれを修正できます。

于 2015-07-08T13:37:06.223 に答える