我在自定义验证属性中有以下代码,名为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。随后刷新视图不会激活断点并获得旧值。我认为这是缓存验证属性。我的问题是:这是因为缓存吗?如果是,那么如何禁用它?提前致谢
答案 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; }
允许在去年输入日期。您可以针对您需要的方案修改此项。