Передача DateTime контроллеру через URL, вызывающая ошибку в ASP.NET MVC 3 (культура)

мое приложение настроено с культурой pt-BR (дата-dd-mm-yyyy) в интернете.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)
{
}

вызов этого метода непосредственно в браузере передает null, когда дата с португальским форматом-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 ответов


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

  • при использовании запроса POST связующее устройство модели по умолчанию использует параметры культуры для анализа дат.

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

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

Вы может взглянем на!--17-->блоге который попадает в более подробную информацию.


как кто-то, кто делает много работы с компаниями США, у меня было много опыта в вопросах даты.

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

dd-MMM-yyyy

и

yyyy-MM-dd

являются безопасными ставками и будут успешно проанализированы DateTime.Разбор (obj).

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


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


получил ту же проблему с помощью @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.