Передача 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.