【问题标题】:ASP.NET MVC 4 routing corrupting a decimal json valueASP.NET MVC 4 路由损坏十进制 json 值
【发布时间】: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


【解决方案1】:

this answer。简而言之,默认的模型绑定器使用.net的类型转换器,它不能将整数转换为小数。

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2014-05-25
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    相关资源
    最近更新 更多