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). Пожалуйста, сообщите, если есть проблема с этим методом на других языках или в других регионах.