2

последние дни Мне довольно сложно убедить проект MVC5 работать с датами, как я хотел бы. После интенсивного поиска в Интернете я пробовал многочисленные аттестаты, чтобы он работал нормально, но безуспешно.ASP.NET MVC5 хранит дату в неправильном формате

Вот проблема:

мне нужно для отображения и редактирования даты на веб-странице в формате ДД.ММ.ГГГГ (т.е. 15.07.2015). Для редактирования мне также нужно использовать jquery ui datepicker. Дело в том, что я смог успешно установить, что datepicker отображает дату в запрошенном формате, также проверка правильности jquery теперь корректно проверяет дату в данном формате. Так что для пользовательского интерфейса пока что так хорошо. Проблема появилась в момент, когда я нажал кнопку отправки - появилось сообщение об ошибке:

Значение «15 .07.2015» недействительно для начальной даты.

После непродолжительного расследования я обнаружил, что когда дата передается на сервер, он имеет формат переключения - вместо dd.MM.yyyy дата обрабатывается как MM.dd.yyyy. Другими словами, ошибка всплывает только тогда, когда на следующий день часть даты выше 12.

Вот некоторые моменты из моего кода:

В моей модели на сегодняшний день у меня есть это:

[Required] 
[Display(Name = "Start Date")] 
[DataType(DataType.Date)] 
[UIHint("Date")] 
[DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}", ApplyFormatInEditMode = true)] 
public DateTime DateStarts; 

Я считаю, что все, что мне нужно сделать, чтобы сделать отображение даты в указанном формате, а также заставить пользователей заполнить текстовое поле датой в правильном формате.

Как указано в [UIHint («Дата»)], у меня есть собственный шаблон для рендеринга текстового поля для даты редактирования. Реализация этого шаблона заключается в следующем:

@model Nullable<DateTime> 

@{ 

DateTime dt = DateTime.Now; 

if (Model != null) 
{ 
    dt = (System.DateTime)Model; 
} 

@Html.TextBox("", dt.ToString("dd.MM.yyyy"), new { @class = "form-control datecontrol", type = "text", data_val_date = "Field must have format dd.MM.yyyy" }) 
<i class="fa fa-calendar form-control-feedback lowerzindex"></i> 

}

JQuery DatePicker имеет следующие реализации:

$('.datecontrol').datepicker({ 
    onClose: function() { $(this).valid(); }, 
    minDate: "-1M", 
    dateFormat: "dd.mm.yy", 
}); 

Так что даже DatePicker знает, как формат должен выглядеть.

Последний компонент является проверка на jquery.validation:

$.validator.addMethod(
    'date', 
    function (value, element, params) { 
     if (this.optional(element)) { 
      return true; 
     }; 
     var result = false; 
     try { 
      $.datepicker.parseDate('dd.mm.yy', value); 
      result = true; 
     } catch (err) { 
      result = false; 
     } 
     return result; 
    }, 
    '' 
); 

Я знаю, что дата передается на сервер в какой-то культуры нейтральном формате, но я подумал, что, когда я оформленный код на многих местах с запрошенный формат, это обеспечит правильное преобразование в нейтральный формат этой культуры. Или я пропустил что-то еще?

Благодаря

+2

Что является культурой сервера? Является ли его формат даты dd/MM/yyyy? –

+1

И вы можете удалить следующие '[DataType (DataType.Date)] и' ApplyFormatInEditMode = true' в '[DisplayFormat (DataFormatString =" {0: dd.MM.yyyy} ", ApplyFormatInEditMode = true)]' - оба из которых используются '@ Html.EditorFor()' для отображения браузера HTML5 datepicker, но вы используете плагин jquery, чтобы они ничего не делали. Затем вы также можете удалить свой шаблон и заменить его только '@ Html.TextBoxFor (m => m.DateStarts," {0: dd.MM.yyyy} ", новый {@class =" form-control datecontrol "}) ' –

ответ

5

Ваша проблема заключается в том, что вы не установили правильный Culture для вашего приложения. Ваш запрос заканчивается в рамках культуры, у которого есть month-day-year (возможно, под en-US), что вызывает у вас проблемы.

Самым простым решением является набор установить культуру, которая на самом деле имеет day-month-year порядок и . в качестве разделителя даты в вашем web.config, например:

<configuration> 
    <system.web> 
     <globalization uiCulture="de-DE" culture="de-DE" /> 
     ... 

https://msdn.microsoft.com/en-us/library/bz9tc508%28v=vs.140%29.aspx

MVC использует текущую культуру при анализе и привязанные данные к вашим моделям/параметрам. Рекомендуется использовать такой же разделитель даты по всей области - html, client, javascript, server culture, ...

+1

Спасибо, похоже, это был последний кусок, отсутствующий во всем формате datetime hell;) – Emil

 Смежные вопросы

  • Нет связанных вопросов^_^