验证归因于缓存

时间:2013-02-13 08:45:37

标签: asp.net-mvc-3 validation custom-attributes

我在自定义验证属性中有以下代码,名为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。随后刷新视图不会激活断点并获得旧值。我认为这是缓存验证属性。我的问题是:这是因为缓存吗?如果是,那么如何禁用它?提前致谢

1 个答案:

答案 0 :(得分: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; }

允许在去年输入日期。您可以针对您需要的方案修改此项。