Подтвердить что ты не робот

Kendo DatePicker не выполняет проверку правильности формата даты

Я использую Kendo DatePicker для редактирования поля Date, отображаемого в сетке Kendo в моем проекте ASP.NET MVC 4. Чтобы использовать DatePicker для поля Date, используйте пользовательскую строку формата даты, я обновил файл Date.cshtml в папке EditorTemplates до следующего значения:

@(Html.Kendo().DatePickerFor(m => m).Format("dd/MM/yyyy"))

Таким образом, мне удалось отобразить формат DatePicker в формате, в котором я хочу. Однако он не прошел проверку для некоторых введенных для ввода дат, либо с помощью ручного ввода или выбора из всплывающего календаря.

После дальнейшего изучения могу сказать, что DatePicker проверяет дату на основе формата M/d/Y. Это предположение было основано на моих основаниях, что 12/1/2012 является действительной датой, тогда как 13/1/2012 не является.

Я также попытался добавить .ParseFormat("dd/MM/yyyy") в конец объявления DatePicker в Date.cshtml, но ничего не исправляет. Поэтому я бы сказал, что это определенно ошибка, и я сообщу об этом Telerik позже.

Но пока я ищу обходное решение, чтобы это работало. Я обнаружил, что могу переопределить kendo.ui.validator.rules.mvcdate в Javascript, чтобы иметь свою собственную функцию проверки. Хотя эта работа отлично работает в Chrome, она не работает в IE9.

Итак, любые идеи, как я могу заставить DatePicker принимать входной формат dd/MM/yyyy? Спасибо заранее.

4b9b3361

Ответ 1

Внутри правило проверки даты для ASP.NET MVC (ненавязчивая проверка клиента) использует метод kendo.parseDate(string), который внутренне будет использовать предопределенные шаблоны дат, если формат /s не определен/не определен. Я полагаю, что в вашем случае культура по умолчанию "en-US", и поэтому проверка не выполняется, потому что даты с форматом "dd/MM/yyyy" считаются недействительными. Одно из возможных решений - переопределить правило проверки даты (как и вы) и проанализировать строку с использованием определенного формата. Другой вариант - установить настройки культуры культуры для страницы. Например, формат коротких дат для культуры de-DE - "dd/MM/yyyy" .

Ответ 2

Я использую этот метод, и он работает нормально.

Добавьте эти две строки на свою страницу.

<script src="@Url.Content("~/Scripts/jquery.validate.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>

Затем переопределите метод проверки даты jQuery..

<script>
    $(document).ready(function () {
        kendo.culture("en-MY"); //your culture
        $.validator.addMethod('date',
           function (value, element) {
               return this.optional(element) || kendo.parseDate(value)
           });
    });
</script>

Между тем в моем Web.config у меня есть это...

<system.web>
    <globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>

Ответ 3

  [DataType(DataType.Date)]
  [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
  [Required(ErrorMessage = "Pick a date from Kendo Date Picker")]
   public DateTime mydate{ get; set; }

    @(Html.Kendo().DatePickerFor(m=>m.mydate)
                .Name("MyDate")
                .Format("dd/MM/yyyy")
                 .ParseFormats(new string[] {"dd/MM/yyyy"}))

/Добавить script функция document.ready/

     $(document).ready(function () { kendo.culture("en-GB");

         $.validator.methods['date'] = function (value, element) {
    var check = false;
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    if (re.test(value)) {

        var adata = value.split('/');
        var dd = parseInt(adata[0], 10);

        var mm = parseInt(adata[1], 10);
        var yyyy = parseInt(adata[2], 10);
        var xdata = new Date(yyyy, (mm - 1), dd);

        if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == (mm - 1)) && 
            (xdata.getDate() == dd)) {

            check = true;
        }
        else {
            alert(value);
            check = false;
        }

    } else
        check = false;
    return this.optional(element) || check;
}

});

Ответ 4

Я изменил правило проверки даты:

$.validator.methods.date = function (value, element) {
    return this.optional(element) || /^\d\d?-\w\w\w-\d\d\d\d/.test(value);
};

Мой формат немного отличается от вашего, но вы должны иметь возможность изменить это.

Ответ 5

У меня была такая же проблема при использовании компонента Gantt здесь. Поддержка Telerik поместила меня на правильные строки, обратившись к здесь.

Мое решающее упущение состояло в том, что я не включил следующее в мой файл _Layout.vbhtml:

<script>
kendo.culture("en-GB");
</script>

После включения (вместе с соответствующим kendo.culture script в моем пакете JS) помощник начал вести себя как ожидалось.

Ответ 6

Простым ответом является не использование пользовательского формата даты. Просто всегда делайте .Format( "MM/dd/yyyy" ) явно и не используйте "dd/MM/yyyy" ( "yyyy-MM-dd" или "MMM d, yyyy" может быть в порядке). И настройте свой веб-сервер на использование региональных настроек США на панели управления или в Web.config.

Теперь для объяснения проблемы и того, как на самом деле сделать работу dd/MM/yyyy:

Квандо date date использует формат даты кендо по умолчанию kendo.culture(). calendar.patterns.d(и .t для времени). Если вы установите это прямо или примените другую культуру, которая устанавливает формат даты, на который будет проверяться. Он использует kendo.parseDate, поэтому что-то вроде "MMM d, yyyy" будет хорошо, но что-то вроде "dd/MM/yyyy" не будет проверяться, если d > 12 и используется культура США по умолчанию (см. Кендо Глобализация демо для того, как переключающие культуры).

Причина этого в том, что DatePicker.Format(...) немного сломан. Это ошибка в kendo.aspnetmvc.js, которая предоставляет альтернативную функцию проверки даты, которая игнорирует формат DatePicker и просто запускает parseDate с использованием текущего формата даты культуры. Это фиксированный javascript:

    date: function(input) {
        var dp = input.data("kendoDatePicker") || input.data("kendoDateTimePicker");
        if (dp != undefined) {
            return input.val() === "" || kendo.parseDate(input.val(), dp.options.format) !== null;
        }

        return input.val() === "" || kendo.parseDate(input.val()) !== null;
    },

Кроме того, существует незначительная ошибка в функции проверки даты в файле kendo.validator.js/kendo.web.js, которая делает проверку даты на сетках в Internet Explorer всегда сбой.

Кроме того, убедитесь, что для вашей веб-серверной глобализации установлено значение US для соответствия культуре кендо (в Web.config или в региональной панели управления Windows). Firefox сообщает MM/dd/yyyy, и веб-сервер должен соответствовать ему. Кроме того, региональный формат даты веб-сервера применяется ко всем клиентским браузерам, если вы явно не указали DatePicker.Format. Поэтому, если на вашем веб-сервере установлены канадские/британские форматы даты, установленные в панели управления для Windows, кендо-сетка DatePickers по умолчанию - dd/MM/yyyy, затем ошибка в проверке и снова, когда сообщения firefox на веб-сервере (культура кэндо по умолчанию под заголовками firefox MM/dd/yyyy, поэтому, если ваш веб-сервер ожидает dd/MM/yyyy, привязка даты mvc не удалась).

Примечание. Если вы предпочитаете использовать валидатор даты, отличного от mvc: Удалите атрибут date-val-date. Добавить: data-type =\ "date \" data-format =\ "dd/MM/yyyy h: mm: ss tt \". Я считаю, что это невозможно с помощью html-помощника. Вы должны напрямую указать html и javascript.

Примечание. Нетрешетка DatePickers, похоже, не имеет подтверждения из-за отсутствия атрибута "дата-дата-дата".

Также: "Помните, что KendoUI сначала использует параметр parseFormats для синтаксического анализа даты, затем преобразует его в формат и, наконец, запускает проверки. Поэтому я использую в валидации yyyy-MM-dd, а не [" MM/dd/yyyy "," dd/MM/yyyy "]." - Как проверить дату в формате yyyy-MM-dd с помощью валидатора kendo?

Линия глобализации для Web.config:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />