24

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

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

但这会引发错误,无法将系统日期时间转换为双倍。任何人都可以在模型本身中提出解决方法吗?

4

3 回答 3

34

即使有Range接受该类型的类型和边界值并允许类似这样的属性的重载:

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

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

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

public class DateTimeRangeAttribute : ValidationAttribute
{
    //implementation
}
于 2013-06-26T14:01:49.760 回答
33

使用此属性:

public class CustomDateAttribute : RangeAttribute
{
  public CustomDateAttribute()
    : base(typeof(DateTime), 
            DateTime.Now.AddYears(-6).ToShortDateString(),
            DateTime.Now.ToShortDateString()) 
  { } 
}
于 2013-06-26T13:52:28.557 回答
4

根据 Rick AndersonRangeAttribute的说法,jQuery 验证不起作用。如果您使用 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; }
于 2017-06-19T18:35:10.680 回答