using System; using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.ValidationAttributes { /// /// Атрибут валидации даты-времени /// [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property)] public class DateValidationAttribute : ValidationAttribute { private DateTime? gtDate; /// /// null разрешен /// public bool AllowNull { get; set; } = true; /// /// Разрешена только дат. /// При наличии времени в DateTime инвалидирует. /// При наличии UTC тоже инвалидирует. /// public bool IsDateOnly { get; set; } = false; /// /// Допустима дата-время в UTC /// public bool AllowUtc { get; set; } = true; /// /// Дата больше которой должно быть проверяемое значение. /// Формат строки - любой поддерживаемый DateTime.Parse. /// Желательно использовать ISO 8601 формат /// public string? GtDate { get => gtDate.ToString(); set { if(value is null) gtDate = null; else gtDate = DateTime.Parse(value); } } /// /// Проверка значения /// /// /// public override bool IsValid(object? value) { if (value is null) return AllowNull; if (value is not DateTime dateTime) return false; if (IsDateOnly) { if (dateTime.Hour > 0 || dateTime.Minute > 0 || dateTime.Second > 0 || dateTime.Millisecond > 0 || dateTime.Kind == DateTimeKind.Utc) return false; } if (!AllowUtc && dateTime.Kind == DateTimeKind.Utc) return false; if (gtDate.HasValue && dateTime <= gtDate) return false; return true; } } }