ASP.NET MVC模型绑定器使用GET和POST请求以不同方式解析小数

时间:2011-06-01 14:23:39

标签: asp.net-mvc asp.net-mvc-3 modelbinders

服务器托管Asp.net mvc3应用程序,浏览器文化设置为da(丹麦语)

GET request url: /get?d=1.1  (note that the decimal separator is .)
return: da;1,1   (note that the decimal separator is ,)

GET request url: /get?d=1,1  (the decimal separator is ,)
return: Exception Details: System.ArgumentException: The parameters dictionary contains a null entry for parameter 'd' of non-nullable type 'System.Decimal' for method 'System.Web.Mvc.ContentResult get(System.Decimal)' in 'Intranet.Controllers.OrderController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

但是对于一个帖子请求给出相同的输入,结果正好相反。

POST request url: /get2    (form data d=1.1)
return: Exception ...

POST request url: /get2    (form data d=1,1)
return: da;1,1

我认为POST请求按预期工作。但为什么GET请求表现不同?在这种情况下,默认模型绑定器如何工作。

1 个答案:

答案 0 :(得分:2)

通过帖子发送数据时,语言环境生效。当您通过GET发送数据时,它始终使用不变的语言环境。

似乎这样做是因为您可以复制并粘贴网址,然后将其发送给其他国家/地区的某个人。如果在URL(GET)中包含参数时考虑了浏览器的语言,则URL会中断(如果考虑日期格式而不是小数分隔符,则更明显)。

在其他地方,.Net团队成员在此提及:http://forums.asp.net/t/1461209.aspx/1?Nullable+DateTime+Action+Parameters+Parsed+in+US+format+irrespective+of+locale+