如何使模型绑定在第一次失败后不停止

时间:2019-12-13 22:50:21

标签: asp.net-core asp.net-core-webapi

如果请求失败,我将尝试在WebApi中实现详细描述的错误。当尝试将json主体绑定到DTO类时,对于模型绑定失败的第一个属性,我得到了非常好的可读性错误,但随后似乎停止了。我想返回模型绑定失败的所有字段的信息。

我的DTO类如下:

public class RequestDTO
{
   public int FirstValue { get; set; }
   public int SecondValue { get; set; }
}

传递以下JSON时

{
    "firstValue": "y",
    "secondValue": "x"
}

我收到以下答复

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|6ba7ef4a-442494fd16304f12.",
    "errors": {
        "$.firstValue": [
            "The JSON value could not be converted to System.Int32. Path: $.firstValue | LineNumber: 1 | BytePositionInLine: 18."
        ]
    }
}

我想要达到的目标是得到像这样的回复

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|6ba7ef4a-442494fd16304f12.",
    "errors": {
        "$.firstValue": [
            "The JSON value could not be converted to System.Int32. Path: $.firstValue | LineNumber: 1 | BytePositionInLine: 18."
        ],
        "$.secondValue": [
            "The JSON value could not be converted to System.Int32. Path: $.secondValue | LineNumber: 1 | BytePositionInLine: 19."
        ]
    }
}

但是我不知道该怎么做。我希望我的问题足够清楚,否则请发表评论,我会进行更新。

1 个答案:

答案 0 :(得分:1)

从3.0版开始,ASP.NET Core使用System.Text.Json处理JSON。它会在出现第一个错误时停止反序列化,并且似乎没有禁用它的设置。

如果您需要更多反序列化错误,则可以使用旧的Newtosoft.Json。只需添加Microsoft.AspNetCore.Mvc.NewtonsoftJson nuget包,然后在ConfigureServices

中添加以下行即可
services.AddControllers();

services.AddControllers().AddNewtonsoftJson();

但是,System.Text.Json的性能更好,建议使用它。