.NET Core 2.1 覆盖自动模型验证

13
在最新的.NET Core 2.1中,引入了模型状态验证的自动验证(https://blogs.msdn.microsoft.com/webdev/2018/02/02/asp-net-core-2-1-roadmap/#mvc)。
以前,我可以通过以下代码覆盖验证错误响应:
public class ApiValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(new context.ModelState);
        }

    base.OnActionExecuting(context);
}

但现在它不再起作用了。验证错误响应时没有进入覆盖方法。

有人有任何线索吗? 谢谢。


看起来你只需要移除ApiController属性。这将“恢复”逻辑到“旧”风格。 - Silvermind
1
@Silvermind,你说得完全正确。我太傻了,没有想到那个。谢谢! - Kes
2个回答

19

如果您希望继续使用ApiController属性(该属性还具有其他功能,例如禁用惯例路由并允许模型绑定而无需添加[FromBody]参数属性),则可以通过在Startup.cs文件中执行以下操作来实现:

services.Configure<ApiBehaviorOptions>(opt =>
{
    opt.SuppressModelStateInvalidFilter = true;
});

如果ModelState无效,这样做将使其不会自动返回400错误。


你救了我的命,我已经找了很长时间这段代码。 - Fatih Çakıroğlu
我还需要在MVC选项中添加options.Filters.Add(typeof(ValidateModelAttribute)); 才能使其工作,详见Daniel的回答。 - GJKH

11

最近一个朋友问我的时候,我的处理方法是用自定义的过滤器替换默认的ModalStateInvalidFilter

在我的测试中,我实现了这里的建议,然后:

services.AddMvc(options =>
{
    options.Filters.Add(typeof(ValidateModelAttribute));
});


services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; });

1
谢谢分享这个以及博客文章 :) - Shivam Chawla

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