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 属性的 getter 上设置了断点。我第一次打开视图时,断点被激活并且 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; }

这将允许在去年输入日期。您可以根据您需要的场景修改它。

于 2015-07-08T13:37:06.223 回答