将.net核心从2.2迁移到3.0-preview-9后,模型绑定停止工作

时间:2019-09-10 14:53:19

标签: c# angular asp.net-core .net-core asp.net-core-3.0

我有一个Angular前端应用程序和一个.NETCore后端应用程序,一切都很好,直到我决定将.NETCore从2.2迁移到3.0-preview-9。

例如

我有DTO课程

public class DutyRateDto
{
    public string Code { get; set; }
    public string Name { get; set; }
    public decimal Rate { get; set; }
}

和示例请求

{
    "name":"F",
    "code":"F",
    "rate":"123"
}

在迁移之前,这是一个有效的请求,因为“ 123”被解析为十进制,但是现在在迁移之后,此主体出现HTTP 400错误

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|3293cead-4a35656a3ae5e95b.",
    "errors": {
        "$.rate": [
            "The JSON value could not be converted to System.Decimal. Path: $.rate | LineNumber: 0 | BytePositionInLine: 35."
        ]
    }
}

它并没有到达我方法的第一行,而是在模型绑定上抛出了。

如果我发送

{
    "name":"F",
    "code":"F",
    "rate":123
}

一切正常,但这意味着我需要更改到目前为止已写的每个请求。

所有数据类型(整数,布尔...)都是一样的

有人知道我如何避免这种情况并使它在不更改我的请求的情况下工作吗?

1 个答案:

答案 0 :(得分:2)

ASP.NET Core 3使用System.Text.Json代替Newtonsoft.Json(又名JSON.NET)来处理JSON。 JSON.NET支持将字符串解析为十进制,但System.Text.Json不支持。如docs中所述,在这个阶段要做的最简单动作是重新使用JSON.NET:

  

将小数作为JSON数字传递会更正确,但很显然,这对您来说不是一个选择。