当通过身体中的HTTP-POST传递并通过HTTP-GET作为查询参数传递时,DateTime的解析方式不同

时间:2016-04-15 08:35:51

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

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

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

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

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

en_US

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

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

更新

为避免混淆,正确调用该方法并在两种情况下返回值。只是domain.tld/controller/action?date=04%2F15%2F2016&someText=Hello+World&someNumber=42 param(实际上是DateTime)没有被设置,就像我将它设置为某个无效日期一样字符串。

2 个答案:

答案 0 :(得分:3)

  

为什么HTTP-POST调用的处理方式不同于   HTTP-GET?

默认模型绑定器使用以下文化,具体取决于HTTPVERB

  • 您的HTTPGET的InvariantCulture
  • 您的HTTPPOST请求的CurrentCulture。

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

想象一下,我们有一位来自美国的用户希望向他们在英国的朋友发送关于2016年4月15日举行的活动的网址。 (2016年4月15日)。他们给他们的朋友以下网址......

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

如果我们不使用Invariant Culture,那么这个日期对于我们在英国的朋友来说是无效的,因为他们的文化期望dd / mm / yyyy。

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

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

希望这有帮助!

答案 1 :(得分:-1)

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

修改 **忽略一下**:因为两种方法中的网址编码相同

" GET请求中唯一的区别是所有特殊字符都将被编码为for. ex / to %2fPOST中不会发生这种情况。"