Aspnet Mvc十进制序列化错误

时间:2018-01-18 07:43:31

标签: c# validation controller asp.net-core-mvc

我有一个post方法接受包含decimal属性的对象,如下所示

[HttpPost]
public async Task<IActionResult> Create(CreateDto createDto)
{
    ...do stuff here
}

public class CreateDto
{
    [Required]
    public string Id{ get; set; }

    [Required]
    public decimal? Rate{ get; set; }
}

当包含前导0的值传入Rate字段时,例如:0015,它总是以10为单位。

如果有人能够解释这种现象,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题在于aspnet核心mvc JSON解析器,该解析器允许在数字之前的前导零处于[0-7]范围内,并将它们视为八进制,以匹配在javascript中使用eval获得的结果类型。

这种行为与http://json.org中所述的行会线相矛盾:

  

“除了八进制之外,数字非常类似于C或Java编号   不使用和十六进制格式。“

并且语法图不允许数字具有前导非重要零。

RFC 4627第2.4节。同意:

  

“不允许使用八进制和十六进制表格。不允许使用前导零。”

简而言之,唯一的方法是使用正确实现Json规范的JSON解析器。

参考:Override Json deserializing a number with a leading zero as a decimal and not an octal value