DatetimeRange类似于Range可以指定日期范围,也可传入int类型的参数

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace System.ComponentModel.DataAnnotations
    {
        /// <summary>
        /// 关于返回值形式的枚举
        /// </summary>
        public enum DateTimeRangeType
        {        /// <summary>
            /// 年数
            /// </summary>
            Year,
            /// <summary>
            /// 月数
            /// </summary>
            Month,
            /// <summary>
            /// 天数
            /// </summary>
            Day,
            /// <summary>
            /// 分钟
            /// </summary>
            Minute
        }
        /// <summary>
        /// 时间范围限制(相对当前时间)
        /// </summary>
        public class DateTimeRange : ValidationAttribute
        {
            private DateTimeRangeType _type = DateTimeRangeType.Day;
            /// <summary>
            /// 可选
            /// </summary>
            public int Min { get; set; }
            /// <summary>
            /// 可选
            /// </summary>
            public int Max { get; set; }
            /// <summary>
            /// 可选 默认DateTimeRangeType
            /// </summary>
            public DateTimeRangeType Type
            {
                get
                {
                    return _type;
                }
                set
                {
                    _type = value;
                }
            }        /*
            public static bool DateTimeRangeAttribute(Type Type,int minDateTime,int maxDateTime)
            {
                return true;
            }*/
            /// <summary>
            /// ErrorMessage = "{0}必须在{1}和{2}之间"
            /// </summary>
            /// <param name="value"></param>
            /// <returns></returns>
            public override bool IsValid(object value)
            {
                if (!(value is DateTime))
                {
                    throw new Exception("字段必须为时间类型");
                }
                
                
                var dateValue = (DateTime)value;
                //if (String.IsNullOrEmpty(ErrorMessage))
                    //ErrorMessage = "{0}必须在{min}和{max}之间";
                if (Min != 0)
                {
                    DateTime minDateTime = GetDateTime(_type, Min);
                    //ErrorMessage = ErrorMessage.Replace("{min}", _type == DateTimeRangeType.Minute ? minDateTime.ToString() : minDateTime.ToShortDateString());
                    if (dateValue < minDateTime)
                        return false;
                }
                if (Max != 0)
                {
                    DateTime maxDateTime = GetDateTime(_type, Max);
                    //ErrorMessage = ErrorMessage.Replace("{max}", _type == DateTimeRangeType.Minute ? maxDateTime.ToString() : maxDateTime.ToShortDateString());
                    if (dateValue > maxDateTime)
                        return false;
                }            return true;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="value"></param>
            /// <param name="validationContext"></param>
            /// <returns></returns>
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {
                validationContext.ObjectType.GetProperty("").GetValue(validationContext.ObjectInstance, null);
                return base.IsValid(value, validationContext);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="name"></param>
            /// <returns></returns>
            public override string FormatErrorMessage(string name)
            {
                return base.FormatErrorMessage(name);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="type"></param>
            /// <param name="diff"></param>
            /// <returns></returns>
            private DateTime GetDateTime(DateTimeRangeType type, int diff)
            {            switch (type)
                {
                    case DateTimeRangeType.Minute:
                        {
                            return DateTime.Now.AddMinutes(diff);
                        }
                    case DateTimeRangeType.Day:
                        {
                            return DateTime.Now.Date.AddDays(diff);
                        }
                    case DateTimeRangeType.Month:
                        {
                            return DateTime.Now.Date.AddMonths(diff);
                        }                case DateTimeRangeType.Year:
                        {
                            return DateTime.Now.Date.AddYears(diff);
                        }            }
                return DateTime.Now;
            }    }
    }