Jquery ASP.NET MVC 4路由损坏十进制json值
我在控制器中有一个方法:Jquery ASP.NET MVC 4路由损坏十进制json值,jquery,asp.net-mvc,json,asp.net-mvc-routing,Jquery,Asp.net Mvc,Json,Asp.net Mvc Routing,我在控制器中有一个方法: [HttpPost] public virtual JsonResult Add(AddItemModel request) 这将接收一个AJAX调用。JSON请求发送“AddItemModel”类的序列化版本,MVC路由创建具有所有预期属性(包括字符串、整数和小数等数据类型)的AddItemModel 然后我将其部署到我们的QA服务器上,其行为是不同的。JSON请求是相同的(由Fiddler检查),但是AddItemModel现在已经填充了它的所有属
[HttpPost]
public virtual JsonResult Add(AddItemModel request)
这将接收一个AJAX调用。JSON请求发送“AddItemModel”类的序列化版本,MVC路由创建具有所有预期属性(包括字符串、整数和小数等数据类型)的AddItemModel
然后我将其部署到我们的QA服务器上,其行为是不同的。JSON请求是相同的(由Fiddler检查),但是AddItemModel现在已经填充了它的所有属性,除了十进制属性-它的值为零,这是默认值
我找不到我们的开发环境和QA服务器之间的任何区别,但我可能没有看到正确的东西
有人能提出是什么导致了这种差异吗
Dev是Win7,QA是Win2003服务器,都运行最新的补丁程序
提前谢谢
格里夫
更新#1 我们为decimal和nullable decimal类型添加了一个自定义模型绑定器,并为此添加了跟踪功能,以便能够确定发生了什么 当值输入时,我们获取了尝试的值:
var attValue = modelBindingContext.ValueProvider
.GetValue(modelBindingContext.ModelName).AttemptedValue;
然后将其转换为十进制值。我们还测试了基的BindModel(控制器、上下文)将返回什么
对于我们来说,当尝试的值为“5”时,我们的转换为十进制值5。但是MVC代码无法处理这个问题-它返回“”作为对象,然后作为零到达控制器方法
然而,当尝试的值为“5.1”时,我们的代码和MVC代码都正确地给了我们5.1的小数点
因此,在我们看来,当:
- JSON的值为:5
- MVC尝试将其绑定到数据类型为decimal的POCO属性,但失败
- JSON的值为:5.1
- MVC试图将其绑定到数据类型为decimal的POCO属性,这是可行的
这里有什么建议吗?请参阅。简而言之,默认模型绑定器使用.net的类型转换器,它不能将整数转换为小数。检查分隔逗号,是
、
还是
?也许JSON序列化会在区域性之间切换,因此会破坏浮点数字。服务器(en-US)和开发机器(en-GB)都以相同的方式使用点和逗号,但我应该更新代码以明确强制使用区域设置。在本例中,小数点仅为“6”(不带引号)。JSON的相关部分是“…,399.99,“ParameterOfInterest”:6}]}”添加了更新#1和一些附加信息。