【发布时间】:2013-05-07 07:55:02
【问题描述】:
我在控制器中有一个方法:
[HttpPost]
public virtual JsonResult Add(AddItemModel request)
这会收到一个 AJAX 调用。 JSON 请求发送“AddItemModel”类的序列化版本,MVC 路由创建具有所有预期属性(包括字符串、整数和小数等数据类型)的 AddItemModel。
然后我将它部署到我们的 QA 服务器,并且行为有所不同。 JSON 请求是相同的(由 Fiddler 检查),但 AddItemModel 现在填充了所有属性,除了小数点之一 - 它的值为零,这是默认值。
我找不到我们的 DEV 环境和 QA 服务器之间的任何差异,但我可能没有找到正确的东西。
谁能提出导致这种差异的原因?
Dev 是 Win7,QA 是 Win2003 服务器,都在运行最新的补丁。
提前致谢
格里夫
更新 #1
我们为十进制和可为空的十进制类型添加了一个自定义模型绑定器,并为此添加了跟踪,以便我们可以确定发生了什么。
当值进来时,我们拿起了尝试的值:
var attValue = modelBindingContext.ValueProvider
.GetValue(modelBindingContext.ModelName).AttemptedValue;
然后将其转换为十进制值。我们还测试了基础的 BindModel(controller, context) 会返回什么。
对于我们来说,当尝试的值为 '5' 时,我们的转换给了我们一个十进制值 5。但 MVC 代码无法处理这个 - 它返回 '' 作为对象,然后到达我们的控制器方法为零。
但是,当尝试的值为“5.1”时,我们的代码和 MVC 代码都正确地为我们提供了小数点 5.1。
所以,在我们看来,当:
- JSON 的值为:5
- MVC 尝试将此绑定到数据类型为十进制的 POCO 属性,但失败
但是当:
- JSON 的值为:5.1
- MVC 尝试将其绑定到数据类型为十进制的 POCO 属性,并且此方法有效
正如我所提到的,这只发生在我们的 QA 服务器上,而不是在 DEV 中。这是否表明微软可能已经解决了这个问题?但如前所述,我们的 DEV 和 QA 环境似乎都已完全修补。
这里有什么建议吗?
【问题讨论】:
-
检查分隔符,是
,还是.?也许 JSON 序列化在文化之间切换,从而破坏你的浮点数 -
好点。服务器(en-US)和开发机器(en-GB)都以相同的方式使用点和逗号,但我应该更新代码以明确强制语言环境。在这种情况下,小数点只是“6”(不带引号)。 JSON 的相关部分是 " ..., 399.99,"ParameterOfInterest":6}]}"
-
添加了更新 #1 以及一些附加信息。
标签: jquery asp.net-mvc json asp.net-mvc-routing