Is there a RangeAttribute for DateTime?

本文关键字:DateTime for RangeAttribute there Is | 更新日期: 2023-09-27 18:20:03

我的模型中有一个Datetime字段,需要对其进行验证,以便在创建它时,它必须介于现在6年前之间。我试过使用这样的范围

[Range(DateTime.Now.AddYears(-6), DateTime.Now)]
public DateTime Datetim { get; set; }

但这引发了一个错误。无法将系统日期时间转换为两倍。有人能在模型本身中对此提出解决方案吗?

Is there a RangeAttribute for DateTime?

使用此属性:

public class CustomDateAttribute : RangeAttribute
{
  public CustomDateAttribute()
    : base(typeof(DateTime), 
            DateTime.Now.AddYears(-6).ToShortDateString(),
            DateTime.Now.ToShortDateString()) 
  { } 
}

即使Range属性有一个重载,它接受该类型的类型和边界值,并允许类似的操作:

[Range(typeof(DateTime), "1/1/2011", "1/1/2012", ErrorMessage="Date is out of Range")]

使用此属性无法实现您想要实现的目标。问题是属性只接受常量作为参数。显然,DateTime.NowDateTime.Now.AddYears(-6)都不是常数。

然而,您仍然可以创建自己的验证属性:

public class DateTimeRangeAttribute : ValidationAttribute
{
    //implementation
}
根据Rick Anderson的说法,jQuery验证不适用于RangeAttribute。如果您使用的是ASP.NET MVC 5的内置jQuery验证,这将导致所选解决方案不正确。

相反,请参阅此答案中的以下代码。

public class WithinSixYearsAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        value = (DateTime)value;
        // This assumes inclusivity, i.e. exactly six years ago is okay
        if (DateTime.Now.AddYears(-6).CompareTo(value) <= 0 && DateTime.Now.CompareTo(value) >= 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult("Date must be within the last six years!");
        }
    }
}

它的实现方式和其他任何属性一样。

[WithinSixYears]
public DateTime SixYearDate { get; set; }