Is there a RangeAttribute for DateTime?

后端 未结 3 1304
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-01 15:57

I have a Datetime field in my Model and need to validate it so that when it is created it has to fall between Now and 6 Years Prior. I have

相关标签:
3条回答
  • 2020-12-01 16:35

    Use this attribute:

    public class CustomDateAttribute : RangeAttribute
    {
      public CustomDateAttribute()
        : base(typeof(DateTime), 
                DateTime.Now.AddYears(-6).ToShortDateString(),
                DateTime.Now.ToShortDateString()) 
      { } 
    }
    
    0 讨论(0)
  • 2020-12-01 16:39

    Even though there is an overload for Range attribute that accepts type and boundary values of that type and allows something like this:

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

    what you are trying to achieve is not possible using this attribute. The problem is that attributes accept only constants as parameters. Obviously neither DateTime.Now nor DateTime.Now.AddYears(-6) are constants.

    However you can still do this creating your own validation attribute:

    public class DateTimeRangeAttribute : ValidationAttribute
    {
        //implementation
    }
    
    0 讨论(0)
  • 2020-12-01 16:50

    jQuery validation does not work with RangeAttribute, per Rick Anderson. This renders the selected solution incorrect if you're using ASP.NET MVC 5's built-in jQuery validation.

    Instead, see the below code from this answer.

    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!");
            }
        }
    }
    

    And it's implemented like any other attribute.

    [WithinSixYears]
    public DateTime SixYearDate { get; set; }
    
    0 讨论(0)
提交回复
热议问题