【问题标题】:Is it possible to control the response of .NET Core Data Annotations?是否可以控制 .NET Core 数据注释的响应?
【发布时间】:2019-05-02 21:52:55
【问题描述】:

我用 .net 核心数据注释修饰了一个 POCO。

public class Foo
{
    [Required]
    [StringLength(100, MinimumLength = 1)]
    public String Name { get;set;}
}

当我使用无效数据调用 API 控制器时,这些数据验证规则开始返回 HTTP 400。有效负载看起来类似于:

{
    "name": [
        "The Name field is required."
      ]
}

我的两个问题:

  1. 我看到很多文档提到 ModeState.IsValid,在我的例子中,控制器甚至没有被输入,也没有添加任何自定义操作过滤器。

  2. 是否可以控制/配置负载响应?

我想返回更多结构化响应

{
    "reason":"Invalid request",
    "errorCode":"BadFooDetails",
    "data" : {
       "name": [
           "The Name field is required." ]
           } 
}

这样做的主要原因是要有一个一致的结构化 ApiError 响应负载。

【问题讨论】:

  • 只是为了详细说明,除了输入验证之外,我们还有其他处理,它使用这个“外部构造”来提供关于错误状态的一致信封。在 data 属性中传输详细信息。唯一的建议是使用中间件来重写响应,但有点感觉我们缺少一些控制。

标签: .net-core data-annotations


【解决方案1】:

我没有注意到 ApiController 和 Controller (MVC) 之间的细微差别。在 ApiController 的情况下,它会自动执行验证,并且不像 MVC 控制器(或简单的 Controller 基类)那样不给开发人员验证的机会。

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在寻找数据注释的ErrorMessage 属性。

    在你的情况下,它应该看起来像

    [Required(ErrorMessage = "My custom error message")]
    [StringLength(100, MinimumLength = 1)]
    public string Name { get; set; }
    

    另一个选择(我建议)是使用FluentValidation 库。非常非常灵活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多