Я использую FluentValidation в проекте MVC5 без каких-либо проблем, кроме дат.Моя цель состоит в том, чтобы GreaterThanOrEqualTo
проверка на стороне клиента работала для нескольких полей даты.Я знаю, что в текущей документации этот метод не указан как поддерживаемый на стороне клиента, но он отображает правильные атрибуты данных проверки jQuery.
В моей модели у меня есть свойство:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
[Display(Name = "Credit Decision Due Date")]
public DateTime? DueDate { get; set; }
На мой взгляд, я использую стандартный синтаксис Razor для отрисовки контрольной группы:
<div class="control-group">
@Html.LabelFor(m => m.DueDate, new { @class = "control-label text-bold" })
@Html.TextBoxFor(m => m.DueDate, "{0:MM/dd/yyyy}", new { @class = "span12 date-picker" })
@Html.ValidationMessageFor(m => m.DueDate)
</div>
В моем валидаторе есть простое правило:
RuleFor(m => m.DueDate).GreaterThanOrEqualTo(DateTime.Today);
Обратите внимание, у меня естьтакже попытался InclusiveBetween
, (который явно указан как поддерживаемый на стороне клиента в документации):
RuleFor(r => r.DueDate).InclusiveBetween(DateTime.Today, DateTime.Today.AddYears(1));
Результат рендеринга представления с GreaterThanOrEqualTo
:
<div class="control-group">
<label class="control-label text-bold" for="DueDate">Credit Decision Due Date <span class="text-error required-asterisk">*</span></label>
<input class="span12 date-picker hasDatepicker" data-val="true" data-val-range="'Credit Decision Due Date' must be greater than or equal to '9/27/2018 12:00:00 AM'." data-val-range-max="" data-val-range-min="09/27/2018 00:00:00" data-val-required="'Credit Decision Due Date' must not be empty." id="DueDate" name="DueDate" type="text" value="">
<span class="field-validation-valid help-block" data-valmsg-for="DueDate" data-valmsg-replace="true"></span>
</div>
Пока что все выглядит довольно неплохо, за исключением того, что клиентская сторона, выполняющая валидацию, работает неправильно, почти как если бы она воспринимала значение как text вместо Date
.Например, ложный отрицательный:
И ложный положительный:
Я ничего не делаю в jQuery Datepicker, прикрепленном к этим полям, кроме принудительной проверки поля сразу после выбора даты:
$('.date-picker').datepicker({
changeMonth: true,
changeYear: true,
onClose: function () {
$(this).valid();
}
});
Все приложение использует локаль "en-US"по умолчанию.Все остальные проверки работают.
Я использую следующие версии библиотеки:
- FluentValidation 8
- jQuery 1.11.3
- jQuery Validate1.17
- jQuery Validate Unobtrusive 3.2.10 (Microsoft)
Я знаю, что мог бы написать собственный валидатор, который перед сравнением анализирует входные значения и значения диапазона в объектах JavaScript Date
, нокажется, что должно быть что-то встроенное, чтобы все распознало эти строки как даты.
Чего мне не хватает?