我在控制器中有一个方法:
[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 环境似乎都已完全修补。
这里有什么建议吗?