通过URL将DateTime传递给控制器​​导致ASP .NET MVC 3(文化)中的错误

Pau*_*aul 19 cultureinfo asp.net-mvc-3

我的应用程序在web.config中设置了pt-BR文化(日期是dd-mm-yyyy):

<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" />
Run Code Online (Sandbox Code Playgroud)

在我的系统上创建的所有DateTime都是正确的格式,但我创建了一个控制器方法:

public ActionResult Test(DateTime date)
{
}
Run Code Online (Sandbox Code Playgroud)

当日期采用portuguese-br格式时,直接在浏览器中调用该方法传递null,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

我如何解决这个问题,接受我的日期格式?

Dar*_*rov 54

有一个默认模型绑定器的问题,不容易知道,但一旦你知道它,你不再犯同样的错误:

  • 使用POST请求时,默认模型绑定器使用您的区域性设置来解析日期.

  • 当您使用GET请求时,默认模型绑定器CultureInfo.InvariantCulture用于解析日期并忽略您当前的文化设置.

由于您正在使用GET请求并将日期作为查询字符串参数传递,因此在URL中发送时应使用不变文化格式对其进行格式化.将日期格式化为查询字符串参数的正确方法是yyyy-MM-dd.

您可以查看以下博文,了解更多详细信息.


Pau*_*lor 9

作为与美国公司合作很多的人,我在日期问题上有很多经验.

我最好的建议是在传输时选择一种明确的格式.

dd-MMM-yyyy
Run Code Online (Sandbox Code Playgroud)

yyyy-MM-dd
Run Code Online (Sandbox Code Playgroud)

是安全的赌注,并将由DateTime.Parse(obj)成功解析.

如果不能更改日期格式,您应该查看DateTime.ParseExact,这样您就可以指定所需的确切格式字符串.