【问题标题】:DateTime parses differently when passed via HTTP-POST in body and via HTTP-GET as query params当通过正文中的 HTTP-POST 和通过 HTTP-GET 作为查询参数传递时,DateTime 的解析方式不同
【发布时间】:2016-08-07 03:10:09
【问题描述】:

在我们的 MVC 3 Web 应用程序中,我们使用当前用户的首选项定义 Thread.CurrentThread.CurrentCulture。但是,在一个视图中,我们始终以mm/dd/yyyy 的格式通过Ajax 提交数据,只要用户的文化是en_US 就可以正常工作。 (显然)

令人惊讶的是,当我们将其作为 HTTP-POST 传递时,它适用于所有用户,但当我们将其作为 HTTP-GET 传递时,它就停止工作了。 (在这两种情况下,离开浏览器的值完全相同)。

知道为什么 HTTP-POST 调用的处理方式与 HTTP-GET 不同吗?

此外,该操作还有其他参数。在 HTTP-POST 的情况下,它们都设置在正文中,例如:

{
  "date": "04/15/2016",
  "someText": "Hello World",
  "someNumber": 42
}

对于 HTTP-GET,它们是查询参数:

domain.tld/controller/action?date=04%2F15%2F2016&someText=Hello+World&someNumber=42

更新:

为避免混淆,该方法被正确调用并在两种情况下都返回值。只是没有设置DateTime 参数(实际上是DateTime?),就像我将它设置为一些无效的日期/字符串一样。

【问题讨论】:

  • 我认为你的最后一行文字应该是“and for HTTP-GET”
  • @SPlatten 你完全正确,为那个错误道歉

标签: ajax asp.net-mvc asp.net-mvc-3 culture


【解决方案1】:

关于 HTTP-POST 调用的处理方式与处理方式不同的任何想法 HTTP-GET?

默认模型绑定器根据 HTTPVERB 使用以下文化

  • 为您的 HTTPGET 提供 InvariantCulture
  • HTTPPOST 请求的 CurrentCulture。

这是因为用户将与来自不同文化背景的其他用户共享他们的 URLS (HTTPGET)。

假设我们有一个来自美国的用户想要向他们在英国的朋友发送一个关于 2016 年 4 月 15 日发生的事件的 URL。 (2016 年 4 月 15 日)。他们给他们的朋友以下网址...

http://www.myurl.com/tickets/?eventdate=04%2F15%2F2016

如果我们不使用不变文化,那么这个日期对我们在英国的朋友无效,因为他们的文化需要 dd/mm/yyyy。

关于 HTTPPOST,用户通常不会与其他用户共享这些类型的请求,因为它们通常是基于每个用户生成的。因此我们可以明确地使用 CurrentCulture。

您可以通过创建自己的模型绑定器来覆盖此默认行为。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    请检查您的请求处理程序是否为GET or POST,如果设置为 POST 则无法处理 GET 请求。

    edit **忽略以下一个**:因为两种方法中的 URL 编码相同

    “在GET 请求中唯一的区别是所有特殊字符都将被编码为for. ex / to %2f 而在POST 中不会发生。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多