DateTime是否有RangeAttribute?

时间:2013-06-26 13:49:30

标签: c# asp.net-mvc

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

这样的范围
[Range(DateTime.Now.AddYears(-6), DateTime.Now)]
public DateTime Datetim { get; set; }

但是抛出错误无法将系统日期时间转换为double。任何人都可以在模型本身中建议解决这个问题吗?

3 个答案:

答案 0 :(得分:26)

即使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
}

答案 1 :(得分:25)

使用此属性:

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

答案 2 :(得分:2)

jQuery验证不适用于RangeAttribute per Rick Anderson。如果您正在使用ASP.NET MVC 5的内置jQuery验证,则会导致所选解决方案不正确。

相反,请参阅this回答中的以下代码。

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; }