DateTime 和 ASP.NET MVC 3 模型绑定的全球化问题
我的应用程序在 ro-RO 区域性设置下运行,在 web.config 全球化部分中配置。如果我发出像模型绑定这样的 POST 请求
POST /myapp/index
date=03-12-2010&value=something
,会将其映射到正确的日期值“2010 年 12 月 3 日”,因为 ro-RO 区域性的默认日期时间格式是 dd-MM-yyyy。如果我将请求方法更改为 GET 并传递相同的数据,
GET /myapp/index?date=03-12-2010&value=something
$.getJSON('/Home/Index', $('form').serialize(), function(d) {
// ...
});
$.post('/Home/Index', $('form').serialize(), function(d) {
// ...
}, 'json');
则 我的操作中的日期值将变为“2010 年 3 月 12 日”(MM-dd-yyyy 日期时间格式)。 “post”必须返回相同的结果,但由于日期时间差异,我得到不同的结果。
如何为 GET 请求启用相同的解析格式?
我知道我可以使用更通用的格式,例如 yyyy-MM-dd 日期,但我只是好奇为什么会发生这种情况?
My application runs under ro-RO culture settings, configured in web.config globalization section. If I make a POST request like
POST /myapp/index
date=03-12-2010&value=something
the model binding maps this to correct date value of "03 December 2010", since the default datetime format for ro-RO culture is dd-MM-yyyy. If I change the request method to GET passing the same data the date value in my action becomes "12 March 2010" (MM-dd-yyyy datetime format)
GET /myapp/index?date=03-12-2010&value=something
$.getJSON('/Home/Index', $('form').serialize(), function(d) {
// ...
});
$.post('/Home/Index', $('form').serialize(), function(d) {
// ...
}, 'json');
So in this case "getJson" & "post" must return the same result, but I get different results because of datetime difference.
How can I enable the same parsing format for GET requests also?
I know I can use a more generic format such as yyyy-MM-dd for dates, but I am just curious why is this happening?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从我之前对此主题的回答: 可空日期时间参数在调用操作时永远不会绑定
“这是有意为之。属于 URI 一部分的任何内容(请注意 URI 中的“统一”)都会被解释为来自不变区域性。这样,复制链接并通过 IM 将其发送给英国朋友的美国用户就可以确信他的朋友将看到完全相同的页面(而不是由于日期时间转换错误而导致 HTTP 500, 一般来说,在 RouteData 或 QueryString 中传递的日期应采用 yyyy-mm-dd 格式,以便跨文化明确。
如果您需要解释。以区域性感知方式获取 QueryString 或 RouteData 参数,将其作为字符串拉入,然后手动将其转换为所需的类型,并传入所需的区域性(DateTime.Parse 具有允许您指定区域性的重载。)如果您这样做,我建议还将所需的区域性作为 QueryString 或 RouteData 参数,以便 URI 的“统一”部分不会丢失,例如 URL 看起来像 ...?culture=fr-fr&date =01-10-1990。”
From my previous answer on this subject: Nullable DateTime Parameter is never bound when calling the action
"This is intentional. Anything that is part of the URI (note the 'Uniform' in URI) is interpreted as if it were coming from the invariant culture. This is so that a user in the U.S. who copies a link and sends it over IM to a friend in the U.K. can be confident that his friend will see the exact same page (as opposed to an HTTP 500 due to a DateTime conversion error, for example). In general, dates passed in RouteData or QueryString should be in the format yyyy-mm-dd so as to be unambiguous across cultures.
If you need to interpret a QueryString or RouteData parameter in a culture-aware manner, pull it in as a string, then convert it to the desired type manually, passing in the desired culture. (DateTime.Parse has overloads that allow you to specify a culture.) If you do this, I recommend also taking the desired culture as a QueryString or a RouteData parameter so that the 'Uniform' part of URI isn't lost, e.g. the URL will look something like ...?culture=fr-fr&date=01-10-1990."