1

我在控制器中有一个方法:

    [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 环境似乎都已完全修补。

这里有什么建议吗?

4

1 回答 1

0

看到这个答案。简而言之,默认模型绑定器使用.net 的类型转换器,它不能将整数转换为小数。

于 2013-12-04T20:01:18.303 回答