代码之家  ›  专栏  ›  技术社区  ›  No1Lives4Ever

ASP.NET核心:自定义验证

  •  2
  • No1Lives4Ever  · 技术社区  · 7 年前

    背景

    我有一个用asp.net core v2.1编写的web api。这是我的服务公开的功能:

    [HttpPost]
    [Route("submit")]
    public async Task<ActionResult<int>> DoIt(CustomModel model)
    {
        if (!ModelState.IsValid)
            return new StatusCodeResult(403); // Custom 403 will be here.
    
        // ...
    }
    

    这就是 CustomModel :

    public class CustomModel
    {
        [Required]
        public int MagicNumber { get; set; }
    }
    

    这种组合(方法+模型)在客户不提供 MagicNumber 到服务器。

    问题

    与旧的asp.net(.net framework)不同,当模型验证失败时,会自动向客户端发送403错误消息。

    我想防止这种默认行为,并给用户一个自定义的错误消息。我更喜欢这样定义自定义响应:

    [HttpPost]
    [Route("submit")]
    public async Task<ActionResult<int>> Submit(CustomModel model)
    {
        if (!ModelState.IsValid)
            return new CustomErrorCode_BadRequest();
        //...
    }
    

    我试过的东西

    Startup.cs 文件

    services.AddMvc(options => options.ModelValidatorProviders.Clear());
    

    if (!ModelState.IsValid) 声明。在此之前,请求在前面的步骤中被阻止。不幸的是 ModelState.IsValid 始终返回 true (无论输入是什么)。我想这是因为我“清除”了所有的验证器-这听起来是个坏主意。

    应该怎么做?

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   No1Lives4Ever    7 年前

    感谢@compufark(图片来源: https://stackoverflow.com/a/51522487/3085985 )将此代码添加到 Starup.cs

        services.Configure<ApiBehaviorOptions>(opt =>
        {
            opt.SuppressModelStateInvalidFilter = true;
        });
    
    推荐文章