Модель MVC меняет день и месяц на немецкую дату - PullRequest
0 голосов
/ 25 февраля 2019

Я пробовал несколько методов, но я не знаю почему, но меня это смущает.

Модель:

public class SearchViewModel
    {        
        [DisplayName("Date from:")]
        //[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{dd.MM.yyyy}")]
        public DateTime? DateFrom { get; set; }

        [DisplayName("Date to:")]
        public DateTime? DateTo { get; set; }
    }

Просмотр:

@using (Html.BeginForm("SearchResult", "Search", FormMethod.Get, new { @id = "searchForDate" }))
{
    <div id="criterias">


        @Html.LabelFor(m => m.DateFrom)
        @Html.EditorFor(m => m.DateFrom, new { htmlAttributes = new { @class = "searchinput datepicker" } })

        @Html.LabelFor(m => m.DateTo)
        @Html.EditorFor(m => m.DateTo, new { htmlAttributes = new { @class = "searchinput datepicker" } })
</div>
    <button type="submit" class="btn btn-danger" style="background-color:#991821; margin-top:15px;" id="search">Search</button>
}

Проблема:

Datepicker работает отлично.Когда я загружаю страницу, я нажимаю на поле EditorFor DateFrom и выбираю дату, скажем, 02.01.2019 (2 января 2019 года).Когда я нажимаю на «Отправить», он запускает действие контроллера.

В действии контроллера model.DateFrom меняет день и месяц.Это означает, что это внезапно 01.02.2019 (2 февраля), что совершенно неверно.Когда я выбираю день выше 12, model.DateFrom недействителен.

Я пробовал следующие вещи:

  • Вставьте [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{dd.MM.yyyy}")] в модель
  • добавил <system.web> <globalization uiCulture="de-DE" culture="de-DE" /></system.web> в мой Web.config
  • добавил атрибут Internationalization -> CurrentCulture и CurrentUICulture в контроллере
  • попытался изменить EditorFor до TextboxFor несколькиминастройки: см. Дата только из TextBoxFor ()

Я также сталкивался с этой статьей: MVC DateTime привязка с неправильным форматом даты но, к сожалению, я знаю, как этоэто не хорошо.

Я не знаю, почему это происходит, и более важно, ГДЕ это происходит?Я установил свою точку останова в классе интернационализации, поставил bp под действием SearchController.ничего не помогаетКогда я нажимаю кнопку отправки, день и месяц изменяют позицию ...

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

* Мой комментарий перенесен в ответ с дополнительной информацией.

Лучше всего рассматривать даты и время как строки.Проблема, с которой вы, вероятно, сталкиваетесь, заключается в различии локали клиента и локали сервера.Многие европейские страны используют dd-MM-YYYY, тогда как США будут использовать MM-dd-YYYY.Если вы не учитываете это при разборе локализации и т. Д., Вы, вероятно, получите эту проблему.Я думаю, что «Как это исправить» сильно зависит от сценария, но я бы использовал строки и пропустил неявное связывание модели от строки к дате.

Обновленная информация

Существует более длинное объяснение, но в основном текущая культура использует формат по умолчанию на сервере, но текущая культура браузера использует другой формат.(Как указано выше.) Вы можете изменить культуру , но это может быть затруднительно в зависимости от вашей ожидаемой аудитории и размера вашей команды.Я проверил это в ограниченном сценарии, но не обязательно рекомендую это из-за нескольких потенциально непроверенных ошибок.(Ваш QA, модульный тест и т. Д. Должны включать все возможные культурные различия, такие как взаимозаменяемые запятые и десятичные точки в числовых значениях [5.00 против 5,00], форматы даты и т. Д.)

Мой предпочтительный подход заключается в использовании общего формата контракта для всех потенциальных проблем, и тогда клиенты (ваш веб-интерфейс) могут правильно отформатировать значение перед отправкой его в серверную часть / API.Для дат и времени я использую формат ISO 8601, и допустимый тип переменной должен быть строкой в ​​конце.

Значение даты будет указано, например, как 2019-02-26 (YYYY-MM-dd).Я предпочитаю это по нескольким причинам:

  • Формат даты не изменяется между форматами.
  • Строки не имеют неправильно проанализированных частей значения.
  • UTC /проблемы смещения не возникают между клиентом и сервером.
  • Строка формата ISO сортируется.
0 голосов
/ 26 февраля 2019

Вы можете попробовать проверить заголовок HTTP-запроса "accept-language".Просто откройте вкладку Сеть инструментов разработчика и нажмите на заголовки ваших запросов для поиска.

accept-language:en-US,en;q=0.9

Это то, что ожидалось?

Также, пожалуйста, посмотрите этот вопрос:

MVC DateTime привязка с неправильным форматом даты

и, в частности, этот ресурс из ответа:

https://weblogs.asp.net/melvynharbour/mvc-modelbinder-and-localization

Надеюсь, это поможет!

edit: Кроме того, если вы еще этого не сделали, я рекомендую использовать UTC для всех дат на стороне сервера.Даты на стороне клиента могут / должны быть по местному времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...