c# - ASP.NET 核心 : Custom validation

标签 c# asp.net asp.net-core asp.net-core-2.1

背景

我有一个用 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 框架)相比,当模型验证失败时 - 将自动向客户端发送 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(无论输入是什么)。我猜这是因为我“清除”了所有验证器——这听起来是个坏主意。

应该怎么做?

谢谢!

最佳答案

感谢@Compufreak(来源:https://stackoverflow.com/a/51522487/3085985)将此代码添加到 Starup.cs 解决了问题:

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

关于c# - ASP.NET 核心 : Custom validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52421451/

相关文章:

c# - 使用 string.concat 还是 string builder 更好?

c# - 如何使用asp.net通过名称获取元素的 "ID"

c# - 检查用户名或用户电子邮件已存在

mysql - ASP.NET核心: How to create a connection string on Macbook pro

c# - 在 PDF 上添加签名图像而不使用 iTextSharp 对其进行数字签名

c# - WPF中上标的上标

c# - 如何实现子类中必须覆盖的常量字段.net 4

html - 打破 css 中一行的表格单元格规则

asp.net-mvc - Linux 上的 aspnet core 1.0 完整的 .net 框架

azure - 为什么不能从应用程序洞察中监控执行队列中的 "Http Request Execution time"、 "Http Request Rate and "Http 请求?