我需要在 ASP.Net core Web API 的验证属性中返回自定义的验证结果(响应)

2023-12-03

我需要在 ASP.Net core Web API 中返回自定义的验证结果(响应)失效属性 这是我创建的 ValidationAttribute。

class MaxResultsAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        int maxResults = (int)value;

        if (maxResults <= 0)
        {
            return new CustomValidationResult(new ValidationResult("MaxResults should be greater than 0"));
        }

        return ValidationResult.Success;
    }
}

我创建了继承 ValidationResult 的 CustomValidationResult 对象,以便我可以返回我自己的自定义响应:

public class CustomValidationResult : ValidationResult
{
    public int FaultCode { get; set; }

    public string FaultMessage { get; set; }

    public CustomValidationResult(ValidationResult validationResult) : base(validationResult)
    {
        FaultCode = 123;
        FaultMessage = validationResult.ErrorMessage;
    }
}

但这不起作用 我需要返回我自己的错误响应

实际反应:

    {
      "MaxResults": [
        "MaxResults should be greater than 0"
      ] 
    }

我期待的回应:

    {
      "code": "55",
      "message": "The following validation errors occurred: MaxResults should be greater than 0"
    }

我期待的回应:

{
  "code": "55",
  "message": "The following validation errors occurred: MaxResults should be greater than 0"
}

我已经使用您的代码重现了问题,使用 CustomValidationResult,我只能得到像您一样的实际响应。为了实现上述行为,作为解决方法,我建议您可以尝试使用操作过滤器来处理验证失败错误响应。检查以下示例代码:

  1. 创建包含返回字段的自定义 ValidationError 模型:

     public class ValidationError
     {
         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
         public string Field { get; }
    
         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
         public int Code { get; set; }
    
         public string Message { get; }
    
         public ValidationError(string field,int code, string message)
         {
             Field = field != string.Empty ? field : null;
             Code = code != 0 ? code : 55;
             Message = message;
         }
     }
    
     public class ValidationResultModel
     {
         public string Message { get; }
    
         public List<ValidationError> Errors { get; }
    
         public ValidationResultModel(ModelStateDictionary modelState)
         {
             Message = "Validation Failed";
             Errors = modelState.Keys
                     .SelectMany(key => modelState[key].Errors.Select(x => new ValidationError(key,0, x.ErrorMessage)))
                     .ToList();
         }
     }
    
  2. 创建自定义 IActionResult。默认情况下,当显示验证错误时,会返回BadRequestObjectResult,HTTP状态代码为400。这里我们可以更改Http状态代码。

     public class ValidationFailedResult : ObjectResult
     {
         public ValidationFailedResult(ModelStateDictionary modelState)
             : base(new ValidationResultModel(modelState))
         {
             StatusCode = StatusCodes.Status422UnprocessableEntity; //change the http status code to 422.
         }
     }
    
  3. 创建自定义操作过滤器属性:

     public class ValidateModelAttribute: ActionFilterAttribute
     { 
         public override void OnActionExecuting(ActionExecutingContext context)
         {
             if (!context.ModelState.IsValid)
             {
                 context.Result = new ValidationFailedResult(context.ModelState);
             }
         }
     }
    
  4. 在 Startup.ConfigureServices 中将默认响应类型更改为 SerializedError:

         services.AddControllers().ConfigureApiBehaviorOptions(options =>
         {
             options.InvalidModelStateResponseFactory = context =>
             {
                 var result = new ValidationFailedResult(context.ModelState);
    
                 // TODO: add `using System.Net.Mime;` to resolve MediaTypeNames
                 result.ContentTypes.Add(MediaTypeNames.Application.Json);
                 result.ContentTypes.Add(MediaTypeNames.Application.Xml);
    
                 return result;
             };
         });
    
  5. 在操作方法或控制器中添加自定义操作过滤器。

     [HttpPost]
     [ValidateModel]
     public async Task<ActionResult<Student>> PostStudent(Student student)
     { 
        ...
     }
    
  6. 创建具有自定义属性验证的 Student 模型(Min18Years):

     public class Student
     {
         [Key]
         public int Id { get; set; }
    
         [Required(ErrorMessage = "Please enter name")]
         public string Name { get; set; }
    
         [Required(ErrorMessage = "Please choose admission date.")]
         [Display(Name = "Admission Date")]
         [DataType(DataType.Date)] 
         public DateTime AdmissionDate { get; set; }
    
         [Display(Name = "Date of Birth")]
         [DataType(DataType.Date)]
         [Min18Years]
         public DateTime DateofBirth { get; set; }
     }
    
    
     public class Min18Years : ValidationAttribute
     {
         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
         {
             var student = (Student)validationContext.ObjectInstance;
    
             if (student.DateofBirth == null)
                 return new ValidationResult("Date of Birth is required.");
    
             var age = DateTime.Today.Year - student.DateofBirth.Year;
    
             if (age <= 0)
             { 
                 return new ValidationResult("MaxResults should be greater than 0");
             } 
             return (age >= 18)
                 ? ValidationResult.Success
                 : new ValidationResult("Student should be at least 18 years old.");
         }
     }  
    

运行应用程序后,结果如下:

enter image description here

参考:

处理 ASP.NET Core Web API 中的验证失败错误

处理 ASP.NET Core Web API 的验证响应

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要在 ASP.Net core Web API 的验证属性中返回自定义的验证结果(响应) 的相关文章

  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • Silverlight 3 工具未显示在 Visual Studio 中

    我下载并安装了Silverlight 3 工具 http go microsoft com fwlink LinkID 143571 我想在 ASP net 页面中使用 Silverlight 服务器控件 但我的工具箱中没有 Silverl
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐