Проверка модели MVC на дату

Есть ли какая-либо проверка по умолчанию для MVC 5, где я могу установить минимальное и максимальное значение даты?

В моей модели я хочу, чтобы проверка даты

public class MyClass { [Required(ErrorMessage="Start date and time cannot be empty")] //validate:Must be greater than current date [DataType(DataType.DateTime)] public DateTime StartDateTime { get; set; } [Required(ErrorMessage="End date and time cannot be empty")] //validate:must be greater than StartDate [DataType(DataType.DateTime)] public DateTime EndDateTime { get; set; } } 

Ps: Согласно этому сайту Asp.Net , существует проблема с использованием средства проверки Range для DateTime, и это не рекомендуется.

Примечание. Проверка jQuery не работает с атрибутом Range и DateTime. Например, в следующем коде всегда будет отображаться ошибка проверки на стороне клиента, даже если дата указана в указанном диапазоне:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

Для использования атрибута Range с DateTime вам необходимо отключить проверку даты jQuery. Обычно не рекомендуется собирать жесткие даты в ваших моделях, поэтому использование атрибута Range и DateTime не рекомендуется.

Я также знаю, что есть пакеты Nuget, такие как Fluent Validation и Foolproof, которые делают трюк для проверки и проверки, если одна дата больше, чем другая, но я хотел знать, есть ли по умолчанию что-то, чтобы проверить минимальное и максимальное значение даты.

Из того, что я видел в Whats new в MVC 5.1 , существует поддержка проверки MaxLength и MinLength .

    Нет необходимости отключать проверку даты jQuery (и это может вызвать другие проблемы). Вам просто нужно переопределить метод range $.validator .

    По умолчанию он работает с числовыми значениями (а затем возвращается к сопоставлению строк), поэтому вы можете добавить следующий скрипт (после jquery.validate.js и jquery.validate.unobtrusive.js , но не завернутый в $(document).ready

     $.validator.methods.range = function(value, element, param) { if ($(element).attr('data-val-date')) { var min = $(element).attr('data-val-range-min'); var max = $(element).attr('data-val-range-max'); var date = new Date(value).getTime(); var minDate = new Date(min).getTime(); var maxDate = new Date(max).getTime(); return this.optional(element) || (date >= minDate && date <= maxDate); } // use the default method return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] ); }; 

    Затем вы можете использовать RangeAttribute в своей собственности

     [Range(typeof(DateTime), "1/1/1966", "1/1/2020")] public DateTime Date { get; set; } 

    Я бы сделал это с интерфейсом IValidatableObject из System.ComponentModel.DataAnnotations, который позволяет добавлять дополнительные правила проверки, где вы можете сделать гораздо большую проверку. Добавьте интерфейс в свой class, а затем Validate метод Validate , где вы можете сравнить StartDateTime с текущей датой / временем, а также сравнить EndDateTime с StartDateTime, например

     public class MyClass : IValidatableObject { [Required(ErrorMessage="Start date and time cannot be empty")] //validate:Must be greater than current date [DataType(DataType.DateTime)] public DateTime StartDateTime { get; set; } [Required(ErrorMessage="End date and time cannot be empty")] //validate:must be greater than StartDate [DataType(DataType.DateTime)] public DateTime EndDateTime { get; set; } public IEnumerable Validate(ValidationContext validationContext) { List results = new List(); if (StartDateTime < DateTime.Now) { results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"})); } if (EndDateTime <= StartDateTime) { results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"})); } return results; } } 

    Единственным потенциальным недостатком этого является то, что Validate работает на стороне сервера, а не в проверке jQuery.

    Обычно я использую это решение, когда хочу проверить что-то на сервере. Я знаю, что вы можете положиться на модель валидации, которую использует MVC, но когда я делаю проверки, я пытаюсь использовать отдельный проект, если мне нужно сделать для них единичный тест. Допустим, у вас есть два приложения: один рабочий стол и один веб-сайт, тогда оба могут совместно использовать ValidationProject вместо повторения кода в обоих приложениях для одного и того же «Просмотр» / «Экран». Идея здесь заключается в том, чтобы изолировать проект валидации как независимый проект вашего решения.

    Таким образом, вы можете загрузить проект FluentValidation из NuGet, FluentValidation использует правила внутри конструктора, вы можете увидеть документацию здесь https://github.com/JeremySkinner/FluentValidation/wiki

    Например, можно использовать правило «Дата», например, вы можете поместить правила для своего значения min и вашего максимального значения:

     public class CustomerValidator: AbstractValidator { public CustomerValidator() { RuleFor(customer => customer.startDate) .NotNull() .WithMessage("You should select a start date") .Must(d => d.HasValue && d.Value <= DateTime.Today) .WithMessage("The start date should not be greather than current month/year"); } 

    Теперь внутри вашего controllerа

     [HttpPost] public ActionResult Index(Customer c) { if(ModelState.IsValid) { var validator= new CustomerValidator(); var valResult = validator.Validate(c); if (valResult.Errors.Count != 0) { valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage)); return View(vm); } //Your code here } } 

    Я думаю, что просто добавление атрибута «Range» будет работать

     [Range(typeof(DateTime), "01/01/1900", "06/06/2079", ErrorMessageResourceType = typeof(Resources.Patient), ErrorMessageResourceName = "DateOfBirth_Range")] 
    Interesting Posts

    Firebase: режим только для чтения и не в режиме реального времени активирован для улучшения производительности браузера

    Что делает «формат»?

    Оператор SQL игнорирует, где параметр

    Как изменить размер значков рабочего стола в Windows 8?

    Как использовать функцию C # 6 «Использование статического»?

    Пакетное переименование файлов с Bash

    Команда Spool: не выводить инструкцию SQL в файл

    Как я могу выбрать, где будут открываться новые окна приложений?

    Добавить пользовательский шрифт для полного приложения для Android

    Каковы ваши любимые методы расширения для C #? (codeplex.com/extensionoverflow)

    Ключевые события: ProcessCmdKey

    Просмотр с горизонтальным и вертикальным панорамированием / drag and dropм и усилением

    Как преобразовать фотографию в черно-белое изображение с помощью ImageMagick?

    ASSETWriterInput для создания видео от UIImages по проблемам Iphone

    Как проверяются сертификаты ssl?

    Давайте будем гением компьютера.