MVC: дата в браузере Chrome

Проблема: я хочу показать дату в немецком формате с глобализацией. С решением, упомянутым в MVc 5 - проверка немецкой даты с помощью unbtrusiv js - простой подход, он работает в IE и Firefox - нет проблем.

Но Google-Chrome использует тип ввода "дата" и показывает средство выбора даты. Проверка никогда не удавалась.

2 ответа

Прочитав много ответов здесь, в stackru, я пришел к этому решению:

В модели я ввожу новое, не отображаемое свойство:

...
    [NotMapped]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime GeburtsdatumChromeEdit
    {
        get { return this.Geburtsdatum; }
        set { this.Geburtsdatum = value; }
    }
...

Это необходимо для добавления данных аннотации DisplayFormat с форматом, который хочет Chrome. Он передает значение в исходное свойство.

В представлении я удвоил ввод для даты и инкапсулировал две группы с помощью специальных классов:

<div class="date4Normal">
        @*Tut nicht in Chrome, da dieser dann einen Input vom Type "Date" verwendet und dieser verlangt dann ein Normdatum yyyy-mm-dd*@
        @Html.EditorFor(model => model.Geburtsdatum)
        @Html.ValidationMessageFor(m => m.Geburtsdatum, String.Empty, new {@class = "text-danger"})
    </div>
    <div class="date4Chrome">
        @Html.EditorFor(model => model.GeburtsdatumChromeEdit)
        @Html.ValidationMessageFor(m => m.GeburtsdatumChromeEdit, String.Empty, new { @class = "text-danger" })
        @*@Html.TextBoxFor(model => model.Geburtsdatum, "{0:dd.MM.yyyy}")
        @Html.ValidationMessageFor(m => m.Geburtsdatum, String.Empty, new { @class = "text-danger" })*@
    </div>

С помощью функции, которую я обнаружил в stackru ( как узнать, поддерживает ли браузер ;), я могу определить, использует ли настоящий браузер ввод даты:

 function checkDateInput() {
        var input = document.createElement('input');
        input.setAttribute('type', 'date');

        var notADateValue = 'not-a-date';
        input.setAttribute('value', notADateValue);

        return (input.value !== notADateValue);
    }

С помощью следующей функции я удаляю ненужные блоки ввода:

 function switchForChrome() {
        var isChrome = checkDateInput();
        if (isChrome) {
            $('.date4Normal').remove();
        } else {
            $('.date4Chrome').remove();
        }
    };

в $(document).ready функция, которую я называю switchForChrome();,

На данный момент, похоже, работает, но проверка даты всегда не удалось.

Поэтому я добавляю некоторый код для работы ( ASP.NET MVC 4 избегает генерации data-val-date для datetime):

if (checkDateInput()) {
    $.validator.addMethod('date',
        function (value, element) {
            return true;
     });
}

И наконец это работает. Для отображения я использую оригинальное свойство (Geburtsdatum) поэтому я получаю языковой формат и для редактирования либо оригинальное свойство (IE, Firefox) или новое свойство GeburtsdatumChromeEdit (Хром, Опера).

Предыдущий ответ мог бы помочь, но когда вы поместите его на сервер, он рухнет, если, как и я, вы производите подсчет процессов с полем информации о датах, поэтому правильный способ решения этой проблемы и отсутствия будущих проблем - это @RAVI VAGHELA на этот пост

вам нужно изменить ваш Global.asax и добавить следующую конфигурацию, помните, что он перепишет все ваши форматы дат и проигнорирует все, что у вас есть на сервере, поэтому будьте осторожны

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var newCulture = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
            newCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";
            newCulture.DateTimeFormat.DateSeparator = "-";
            Thread.CurrentThread.CurrentCulture = newCulture;
        }

Примечание. Этот метод был протестирован на локальном сервере Azure (запад и Европа) (Windows Server 2012 на английском языке) и локально (iis express для Windows 10). Пожалуйста, сообщите, если есть проблема с этим методом на других языках или в других регионах.

Другие вопросы по тегам