ASP.NET Core动作过滤器未被调用

8
我有一个ASP.NET Core API (.Net Core 2.1),并且我使用这篇文章实现了一个Action Filter。

https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1#action-filters

在我的模型中,我使用数据注释来验证模型,并在我的控制器中为操作添加了ValidateModel属性。
    [HttpPost("CreateShipment")]
    [ValidateModel]
    public IActionResult CreateShipment([FromBody] CreateShipmentRequest request)
    {
         if (ModelState.IsValid)
         {
            //Do something
         }
         return Ok();
    }

我使用Postman进行测试,只有在模型有效时才会调用我的Action Filter。如果我的请求缺少必填字段或某些值超出范围,则Action Filter不会被调用。相反,我会收到一个带有响应中模型状态的400错误请求。
我实现了Action Filter,因为我想自定义我的模型验证错误。我的理解是,在模型绑定时调用Action Filters。有人能帮我找出原因并告诉我如何使Action Filter起作用吗?
更新:发布问题后的2秒钟,我找到了解决方案,@Silvermind下面发布的链接也是很好的信息。
我在Startup.cs中添加了以下行:
services.Configure<ApiBehaviorOptions>(options =>
{
     options.SuppressModelStateInvalidFilter = true;
});

这在微软网站上有充分的文件记录。https://learn.microsoft.com/en-us/aspnet/core/web-api/index?view=aspnetcore-2.1#automatic-http-400-responses


2
自从 .net core 2.1 版本以后,[ApiController] 属性会自动被添加到控制器上。它会自动进行一些操作;如果移除该属性,则可以解决这个问题。请查看此文章获取更多信息:Exploring the ApiControllerAttribute and its features for ASP.NET Core MVC 2.1 - Silvermind
1
@Silvermind 感谢你的帮助。实际上,在你发布这个之前,我自己已经找到了解决方案。我在我的Startup.cs文件中的ConfigureServices()方法中添加了以下内容:services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }); - N P
1
这是一个不错的解决方案。我建议你将其作为答案发布,而不是将其添加到你的问题中并接受你自己的答案。 - Silvermind
2个回答

14

3

[ApiController] 属性可以自动执行模型验证并触发 HTTP 响应 404,但在 .Net Core 3.0 中,您可以链接到新的 AddControllers() 来禁用此功能:

services.AddControllers()
                .ConfigureApiBehaviorOptions(options =>
                {
                    options.SuppressModelStateInvalidFilter = true;
                });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接