自定义日期RangeAttribute将在年,月和日的负值上返回异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义日期RangeAttribute将在年,月和日的负值上返回异常相关的知识,希望对你有一定的参考价值。

我创建了一个自定义DateRange属性来检查日期的最大值和最小值。这是代码

 public class DateRangeAttribute : RangeAttribute
    {
        public DateRangeAttribute(int minimumYear, int minimumMonth, int minimumDay, int maximumYear, int maximumMonth, int maximumDay)
            : base(typeof(DateTime), GetMinimumDate(minimumYear, minimumMonth, minimumDay).ToShortDateString()
                , GetMaximumDate(maximumYear, maximumMonth, maximumDay).ToShortDateString())
        {
        }

        private static DateTime GetMinimumDate(int minimumYear, int minimumMonth, int minimumDay)
        {
            if (minimumDay < 0 || minimumMonth < 0 || minimumYear < 0)
            {
                throw new ArgumentException( "the values for minimum date can not be negative." ,paramName: nameof(minimumMonth));

            }
            minimumYear = minimumYear == 0 ? DateTime.MinValue.Year : minimumYear;
            minimumMonth = minimumMonth == 0 ? DateTime.MinValue.Month : minimumMonth;
            minimumDay = minimumDay == 0 ? DateTime.MinValue.Day : minimumDay;
            return new DateTime(minimumYear, minimumMonth, minimumDay);
        }

        private static DateTime GetMaximumDate(int maximumYear, int maximumMonth, int maximumDay)
        {
            maximumYear = maximumYear == 0 ? DateTime.MaxValue.Year : maximumYear;
            maximumMonth = maximumMonth == 0 ? DateTime.MaxValue.Month : maximumMonth;
            maximumDay = maximumDay == 0 ? new DateTime(maximumYear, maximumMonth, 31) == DateTime.MaxValue.Date ?
                                           DateTime.MaxValue.Day : new DateTime(maximumYear, maximumMonth, 1).AddMonths(1).AddDays(-1).Day : maximumDay;

            return new DateTime(maximumYear, maximumMonth, maximumDay);
        }
   }

代码工作得很好。但是如果我传递Year / Month / Day的负值,它会在构造函数中崩溃。我在考虑在构造函数中进行值检查,当参数为负时可以抛出异常。这样的事情

 private static DateTime GetMinimumDate(int minimumYear, int minimumMonth, int minimumDay)
  {
 if (minimumDay < 0 || minimumMonth < 0 || minimumYear < 0)
            {
                throw new ArgumentException( "the values for minimum date can not be negative." ,paramName: nameof(minimumMonth));

            }
         // The rest of the code...
   }  

但它不起作用。

更新:这是我使用此属性的方式

  [DateRange(1900, -1, 0, 0, 0, 0)]
  public DateTime? OriginalDocumentDate { get; set; }

任何帮助将不胜感激。

答案

一个mroe的东西,[DateRange(1900, -1, 0, 0, 0, 0)],当你这样做时,你传递初始化你的RangeAttribute与该值意味着你将使用这个值来比较你输入的值,这个值与你传递给属性的日期时间值进行比较。


试过这样的例子

public class Employee
{
    [DateRange(1900, -1, 0, 0, 0, 0)]
    public DateTime? OriginalDocumentDate { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Employee e = new Employee() { OriginalDocumentDate= DateTime.Now };
        List<ValidationResult> validationResults = new List<ValidationResult>();
        var vc = new ValidationContext(e, null, null);
        var isValid = Validator.TryValidateObject
                (e, vc, validationResults, true);
    }
}

并且发现在Validator.TryValidateObject时没有构造函数被调用,这意味着这个属性只关注方法...即。当验证发生时,它只调用验证属性的方法而不是它的构造函数


我想你必须把这段代码

 if (minimumDay < 0 || minimumMonth < 0 || minimumYear < 0)
            {
                throw new ArgumentException( "the values for minimum date can not be negative." ,paramName: nameof(minimumMonth));

            }

在你的方法调用中,因为在设置值之前调用了属性构造函数,即在创建类之前创建了类...

尝试在你的构造函数中放置断点...


在下面的代码中

class MyCustomAttribute : Attribute {
    public int[] Values { get; set; }

    public MyCustomAttribute(int[] values) {
        this.Values = values;
    }
}

[MyCustomAttribute(new int[] { 3, 4, 5 })]
class MyClass { }

使用array [3,4,5]的值调用自定义属性构造函数,并在属性初始化中传递值为self

以上是关于自定义日期RangeAttribute将在年,月和日的负值上返回异常的主要内容,如果未能解决你的问题,请参考以下文章

pandas:按月和天匹配数据

自定义水平滚动日历

bootstrap的日历插件datetimepicker当在年视图点击,选择完年视图后,不想让他跳转到日期的视图,怎么去阻止

查询小于给定日期的所有日期(月和年)

按月和日期比较两个日期Python

格式化日期(月和星期)