【问题标题】:Is this a bug? Decimal property not getting deserialized from JSON string (.NET MVC)这是一个错误吗?未从 JSON 字符串 (.NET MVC) 反序列化的十进制属性
【发布时间】:2012-03-28 20:01:50
【问题描述】:

我有以下 .Net 类:

public class Product
{
    public int ID {get;set;}
    public String Name {get;set;}
    public Decimal Price {get;set;}
}

我的控制器中的一个动作:

[HttpPost]
public ActionResult AddProduct(Product product)
{
       // product.Price is zero!!
}

发送到AddProduct 的请求中的 JSON 字符串如下所示(通过 Fiddler2 获取):

POST http://localhost:59656/Cart/AddProduct HTTP/1.1
Host: localhost:59656
Origin: http://localhost:59656
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko Chrome/17.0.963.79 Safari/535.11
Content-Type: application/json; charset=UTF-8
Accept: text/html, */*; q=0.01

{"Product":{"ID":1232, "Name":"Blu-Ray","Price":210}}

为什么product.Price 为零,而其他属性(ID 和名称)得到正确补水?

【问题讨论】:

  • 检查 Request.Form 集合,查找“Price”条目并查看提供的值。
  • 那个集合是空的。请求不是 url 编码的,是 JSON 编码的。我也发布了 HTTP 标头,所以这很清楚。

标签: .net json asp.net-mvc-3 deserialization


【解决方案1】:

尝试发布: {"Product":{"ID":1232, "Name":"Blu-Ray","Price":210.00}}

我认为 MVC 不会从 int 转换/转换为十进制,因此 .00 告诉它使用 float/double/decimal 进行水合。

【讨论】:

  • 贝。愚蠢的微软。我决定将我的变量切换为长数据类型,但它本质上是相同的修复。谢谢,亚历克斯!
  • @ChrisJaynes 请参阅 Phil Haacks 博客文章以获得更好的解决方案。 haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
  • 这并不是要刻薄,但是如何编写一个大的绑定函数比将数据类型切换为 long 更好?仅使用 long 是否会冒其他奇怪行为的风险?
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多