Проблема привязки глобализации Kendo DatePicker

У меня есть приложение asp.net MVC с культурой "es-MX". Вот что у меня есть в моем файле web.config:

<globalization enableClientBasedCulture="true" uiCulture="es-MX" culture="es-MX"></globalization>

И вот что у меня есть на моей странице _Layout:

<script type="text/javascript">
    $(function () {
        //set current to the "es-MX" culture script
        kendo.culture("es-MX");
    })
</script>

У меня есть Kendo DatePicker, как это:

@(Html.Kendo().DatePickerFor(model => model.StartDate)
    .HtmlAttributes(new { @class = "input-field" })
)

Когда я отправляю форму обратно в свой контроллер, поле StartDate имеет значение null.

Вот ответ, который я получаю от сервера:

"Errors":{"StartDate":{"errors":["Значение '07/10/2016 00:00:00' недопустимо для Fecha de Inicio."]}}

Кстати, Accept-Language запроса, отправляемого на сервер, — «en-US», что мне кажется странным.

ОБНОВЛЕНИЕ:

Я попытался использовать привязку пользовательской модели для DateTime, например:

public class DateTimeModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (string.IsNullOrWhiteSpace(value.AttemptedValue))
            return null;

        DateTime dateTime;
        var isDate = DateTime.TryParse(value.AttemptedValue, Thread.CurrentThread.CurrentUICulture, 
            DateTimeStyles.None, out dateTime);

        if (!isDate)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "La fecha es válido.");
            return DateTime.UtcNow;
        }

        return dateTime;
    }
}

Но, похоже, проблема связана с временной частью даты, переданной контроллеру. Значение 07/10/2016 12:00:00 a. m. не распознается как дата ни культурой "es-MX", ни культурой "en-US".


person ataravati    schedule 07.10.2016    source источник
comment
Я не думаю, что проблема связана с культурой, потому что 10.07.2016 должна быть датой проверки как в es-MX (7 октября), так и в en-US (10 июля).   -  person Cloud SME    schedule 07.10.2016
comment
@AndrésNava-.NET, я знаю, но у меня нет проблем, когда я удаляю культуру es-MX из файла web.config и страницы _Layout. Однако, если я просто изменю культуру DatePicker на en-US, она все равно не будет привязана.   -  person ataravati    schedule 07.10.2016
comment
@AndrésNava-.NET, посмотрите мое обновление.   -  person ataravati    schedule 07.10.2016


Ответы (2)


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

"Errors":{"StartDate":{"errors":["Значение '07/10/2016 00:00:00' недопустимо для Fecha de Inicio."]}}

Учитывая перевод Unicode из предоставленного формата JSON, сообщение может быть получено как

"Errors":{"StartDate":{"errors":["Значение '10.07.2016 00:00:00' недействителен для Fecha de Inicio."]}}

'07/10/2016 12:00:00 a. m.' указывает формат даты, переданный в виде строки вместо распознаваемого значения DateTime, поэтому ваш model.StartDate возвращает значение null, поскольку часть времени с состоянием AM/PM не является допустимым значением DateTime или Nullable<DateTime>.

Попробуйте настроить скрипт глобализации в своем представлении:

@section HeadContent 
{
    <script src="@Url.Content("~/Scripts/kendo.all.min.js")"></script>
    <script src="@Url.Content("~/Scripts/cultures/kendo.culture.es-MX.min.js")"></script>
}

или макет страницы:

<head>
<script src="@Url.Content("~/Scripts/kendo.all.min.js")"></script>
<script src="@Url.Content("~/Scripts/cultures/kendo.culture.es-MX.min.js")"></script>
</head>

NB: измените ~/Scripts/cultures/ на путь к каталогу Kendo JS.

Если описанные выше попытки по-прежнему не работают, установите строку формата отображения на DatePickerFor:

@{
    Culture = "es-MX";
}

@(Html.Kendo().DatePickerFor(model => model.StartDate)
    .Name("StartDate")
    .Culture("es-MX")
    .Format("dd/MM/yyyy")
    .ParseFormats(new String[] { "dd/MM/yyyy" })
    .HtmlAttributes(new { @class = "input-field" })
)

или добавив пользовательское правило для ввода даты как это (адаптировано из ответа Эдина Махмутовича в Как сделать допустимый формат даты dd.MM.yyyy KENDO MVC):

kendo.ui.validator.rules.mvcdate = function (input) {
    if ($(input.attr('name')) === 'StartDate') {
        return input.val() === "" || kendo.parseDate(input.val(), "dd/MM/yyyy") !== null;
    }
    return true;
}

Насколько мне известно, когда конкретная строка формата даты не задается методом Format, она использует формат по умолчанию, показанный в этом примере: http://demos.telerik.com/aspnet-mvc/datepicker/index.

Связанные проблемы:

Kendo datepicker действует для разных компьютеров на двух разных часовой пояс

культура Kendo DatePicker работает неправильно

http://www.telerik.com/forums/wrong-format

Справочник по глобализации: http://docs.telerik.com/kendo-ui/aspnet-mvc/globalization

person Tetsuya Yamamoto    schedule 10.10.2016
comment
У меня нет проблем с отображением даты в правильном формате. Проблема заключается в дате, которая публикуется на сервере. Я уже нашел в чем проблема. Проверьте мой ответ. - person ataravati; 10.10.2016

Я понял, в чем дело. Согласно документации, Кендо Сценарии культуры пользовательского интерфейса создаются на основе форматов Windows 8. Я использую Windows 7. Итак, мне нужно поместить этот помощник по культуре вверху страницы, чтобы убедиться, что сценарии генерируются на основе текущей .NET или указанной культуры:

@Html.Kendo().Culture()

Без этого помощника даты, отправленные на сервер, будут как 07/10/2016 12:00:00 a. m. (обратите внимание на пробел между a. и m.), и мой MVC не может их связать. После использования помощника даты будут как 07/10/2016 12:00:00 a.m. (без пробела).

person ataravati    schedule 10.10.2016