it-roy-ru.com

ASP Проверка клиента MVC 5 для диапазона дат

Я хочу проверить поле Datetime в форме. Поле действительно с 01/10/2008 по 01/12/2008. Вот как я определил свойство viewmodel:

    [Required(ErrorMessage = "The date value is mandatory")]
    [DataType(DataType.DateTime)]
    [Range(typeof(DateTime), "01/10/2008", "01/12/2008")]
    [DisplayName("When the work starts")]
    public DateTime StartWork { get; set; }

Я хочу проверить это на стороне клиента. Но я всегда получаю ошибку. Я даю значение 01/11/2008, и оно говорит мне, что дата должна быть определена между 01/10/2008 и 01/12/2008. Я читал, что это не работает проверка клиента без jquery, не так ли? Или я что-то забыл? Какие есть альтернативы, чтобы получить какое-либо решение этой проблемы.

7
MrScf

Я думаю, что вы можете реализовать это с помощью пользовательской проверки в MVC. Попробуйте использовать это:

[ValidateDateRange]
public DateTime StartWork { get; set; }

Вот ваша пользовательская реализация проверки: 

namespace MVCApplication
    {   

        public class ValidateDateRange: ValidationAttribute
        {
            protected override ValidationResult IsValid(object value, ValidationContext validationContext)
            {                 
               // your validation logic
                if (value >= Convert.ToDateTime("01/10/2008") && value <= Convert.ToDateTime("01/12/2008") )
                {
                    return ValidationResult.Success;
                }
                else
                {
                    return new ValidationResult("Date is not in given range.");
                }
            }
        }
    }

Обновление:

Вы также можете передать диапазоны дат в качестве параметров, чтобы сделать проверку общей:

[ValidateDateRange(FirstDate = Convert.ToDateTime("01/10/2008"), SecondDate = Convert.ToDateTime("01/12/2008"))]
public DateTime StartWork { get; set; }

Пользовательская проверка:

    namespace MVCApplication
        {   

            public class ValidateDateRange: ValidationAttribute
            {
              public DateTime FirstDate { get; set; }
              public DateTime SecondDate { get; set; }

                protected override ValidationResult IsValid(object value, ValidationContext validationContext)
                {                 
                    // your validation logic
                    if (value >= FirstDate && value <= SecondDate)
                    {
                        return ValidationResult.Success;
                    }
                    else
                    {
                        return new ValidationResult("Date is not in given range.");
                    }
                }
            }
        }

UPDATE 2: (для клиентской части) Очень простая логика jQuery должна выполнять проверку клиента. Проверьте ниже:

$(document).ready(function(){

  $("#btnSubmit").click(function(){

    var dt = $("#StartWork").val();

    var d = new Date(dt);
    var firstDate = new Date("2008-01-10");
    var secondDate = new Date("2008-01-12");

    if(d>= firstDate && d<= secondDate)
    {
      alert("Success");
    }
    else
    {
      alert("Date is not in given range.");
    }

  });

});

Пожалуйста, проверьте этот JSFiddle, чтобы увидеть рабочую демонстрацию: Проверка диапазона дат

12
Saket

Вы должны указать даты в определенном формате в атрибуте, и вы также можете указать значение в этом формате. Ввод даты не нравится MM/dd/yyyy, хотя в этом формате он отображается! Довольно отсталый ИМХО.

Вам нужно добавить min и max следующим образом:

Результирующий HTML

<input class="form-control text-box single-line input-validation-error" data-val="true" data-val-date="The field DOB must be a date." data-val-required="The DOB field is required." id="DOB" name="DOB" type="date" value="1932-01-01" aria-required="true" aria-describedby="DOB-error" aria-invalid="true" min="1932-01-01" max="2015-01-01">

Модель

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[DataType(DataType.Date)]
public DateTime DOB { get; set; }

Посмотреть

@Html.EditorFor(model => model.DOB, new { htmlAttributes = new { @class = "form-control", min = "1900-01-01", max = "2015-01-01" } })

Тогда вы получите минимальные или максимальные ошибки в пользовательском интерфейсе:

 enter image description here

3
toddmo

Проверка диапазона дат также может быть выполнена с помощью FluentValidation, что может стать еще одним решением вашей проблемы, проверьте мой ответ на нее. Надеюсь это поможет

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

0
Zinov