Передача DateTime в контроллер через URL-адрес, вызывающий ошибку в ASP .NET MVC 3 (культура) - PullRequest
19 голосов
/ 18 января 2012

Для моего приложения задана культура pt-BR (дата - дд-мм-гггг) в файле web.config:

<globalization enableClientBasedCulture="false" requestEncoding="utf-8" responseEncoding="utf-8" fileEncoding="iso-8859-15" responseHeaderEncoding="utf-8" resourceProviderFactoryType="string" enableBestFitResponseEncoding="true" culture="pt-BR" uiCulture="pt-BR" />

Все объекты DateTime, созданные в моей системе, имеют правильный формат, но я создалМетод контроллера такой:

public ActionResult Test(DateTime date)
{
}

Вызов этого метода напрямую в браузере обнуляется, если дата в формате portuguese-br, например:

mysite/Test/?date=19/01/2012   => date = null in my controller

mysite/Test/?date=01/01/2012   => date is fine, but in US format (mm-dd-yyyy)

Как я могу исправитьчто, принять мой формат даты?

Ответы [ 4 ]

54 голосов
/ 18 января 2012

Есть недочёт со связывателем модели по умолчанию, о котором нелегко узнать, но как только вы его узнаете, вы больше не совершаете ту же ошибку:

  • Когда вы используете запрос POST, механизм связывания модели по умолчанию использует ваши параметры культуры для анализа дат.

  • Когда вы используете запрос GET, связыватель модели по умолчанию использует CultureInfo.InvariantCulture для анализа дат и игнорирует текущие настройки культуры.

Поскольку вы используете запрос GET и передаете дату в качестве параметра строки запроса, вы должны отформатировать ее, используя формат инвариантной культуры при отправке в URL. Правильный способ форматирования даты в качестве параметра строки запроса: yyyy-MM-dd.

Вы можете взглянуть на следующую запись в блоге , в которой более подробно.

9 голосов
/ 18 января 2012

Как человек, который много работает с американскими компаниями, я имел большой опыт работы с проблемами дат.

Мой лучший совет - выбирать однозначный формат при передаче.

dd-MMM-yyyy

и

yyyy-MM-dd

Безопасные ставки, и они будут успешно проанализированы DateTime.Parse (obj).

Если изменение формата даты не вариант, вы должны посмотретьна DateTime.ParseExact, что позволяет вам указать точную строку формата, которую вы ищете.

2 голосов
/ 18 января 2012

Один из подходов состоит в том, чтобы принять дату в виде строки, а затем манипулировать ею в контроллере с правильным языком / культурой.

0 голосов
/ 30 октября 2014

Получил ту же проблему, используя @Html.Action(..) в представлении.Для этой ситуации ее можно решить, поместив DateTime в модель:

public class MyModel
{
  public DateTime Value {get;set;}
}

и в представлении:

@Html.Action("MyAction", new { myModel })

Обратите внимание на new { } вокруг экземпляра MyModel, таким образом DateTime не преобразуется в строку.Это решение работает только для Html.Action() и , а не для Html.ActionLink() или Url.Action(), поскольку MVC выполняет myModel.ToString() в URL.

...