当前位置: 首页 > news >正文

.NET 自定义过滤器 - ActionFilterAttribute

这个代码片段定义了一个自定义的 ASP.NET Core 过滤器(GuardModelStateAttribute),用于在控制器动作执行之前验证模型状态(ModelState)。如果模型状态无效,则构造一个 ProblemDetails 对象来描述错误,并返回一个 BadRequest 响应。

代码片段:

/// <summary>
/// 验证 ModelState 是否有效
/// </summary>
public class GuardModelStateAttribute : ActionFilterAttribute
{// <summary>/// 在执行操作之前进行验证。/// 如果模型状态无效,则返回 BadRequest 响应。/// </summary>/// <param name="context">Action 执行上下文</param>public override void OnActionExecuting(ActionExecutingContext context){// 验证 ModelState 是否有效if (!context.ModelState.IsValid){// 构造 ProblemDetails 对象来构建错误响应var problemDetails = new ProblemDetails{Title = "Bad Request",                          // 错误标题Detail = "参数验证失败,请检查输入参数",           // 错误详情Status = (int)HttpStatusCode.BadRequest,        // HTTP 状态码Instance = context.HttpContext.Request.Path,    // 请求路径};// 遍历 ModelState 字典,将错误信息添加到 Extensions 字典中foreach (var key in context.ModelState.Keys){// 获取每个键对应的错误信息var errors = context.ModelState[key]?.Errors;// 如果没有错误信息,则跳过if (errors is not { Count: > 0 }) continue;// 遍历每个错误,并将其添加到 ProblemDetails 的 Extensions 字典中foreach (var error in errors){problemDetails.Extensions.Add(key, error.ErrorMessage);}}// 设置响应结果context.Result = new BadRequestObjectResult(problemDetails);}}
}

代码解读

  1. 类定义

    public class GuardModelStateAttribute : ActionFilterAttribute
    
    • GuardModelStateAttribute 继承自 ActionFilterAttribute,这是一个内置的过滤器接口,用于在执行控制器动作前后执行一些逻辑。
  2. 覆盖 OnActionExecuting 方法

    public override void OnActionExecuting(ActionExecutingContext context)
    
    • OnActionExecuting 方法是在控制器动作执行之前调用的。覆盖这个方法可以让我们在动作执行前做一些预处理工作。
  3. 验证模型状态

    if (!context.ModelState.IsValid)
    
    • ModelState.IsValid 是一个布尔属性,表示模型状态是否有效。如果为 false,表示模型状态无效,即请求中的数据未通过验证。
  4. 构造 ProblemDetails 对象

    var problemDetails = new ProblemDetails
    {Title = "Bad Request",Detail = "参数验证失败,请检查输入参数",Status = (int)HttpStatusCode.BadRequest,Instance = context.HttpContext.Request.Path,
    };
    
    • ProblemDetails 是一个标准的对象,用于描述 HTTP 错误响应。这里设置了错误标题、详细信息、HTTP 状态码(400 Bad Request)以及请求的路径。
  5. 收集并附加错误信息

    foreach (var key in context.ModelState.Keys)
    {var errors = context.ModelState[key]?.Errors;if (errors is not { Count: > 0 }) continue;foreach (var error in errors){problemDetails.Extensions.Add(key, error.ErrorMessage);}
    }
    
    • 遍历 ModelState 中的所有键值对,获取每个字段的验证错误信息,并将这些错误信息添加到 ProblemDetailsExtensions 字典中。
  6. 设置响应结果

    context.Result = new BadRequestObjectResult(problemDetails);
    
    • 设置 ActionExecutingContextResult 属性,返回一个包含 ProblemDetailsBadRequestObjectResult,这将导致控制器不再继续执行,并返回一个带有错误信息的 HTTP 响应。

作用

这个自定义过滤器的作用是:

  • 验证模型状态:在控制器动作执行之前验证请求中的数据是否满足验证规则。
  • 返回错误响应:如果数据验证失败,则构造一个包含详细错误信息的 ProblemDetails 对象,并返回一个 BadRequest 响应。
  • 简化错误处理:通过在过滤器中集中处理模型状态验证,可以减少在每个控制器动作中重复编写类似的错误处理逻辑。

使用方法

// Add services to the container.
#region 向容器中添加服务// 关闭默认模型验证过滤器
builder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);builder.Services.AddControllers(options =>
{// 添加过滤器options.Filters.Add<GuardModelStateAttribute>();
})
.AddNewtonsoftJson(options =>
{options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; //格式化时间
});#endregion

要在控制器中使用这个过滤器,可以在控制器或动作方法上添加 [GuardModelState] 属性:

[ApiController]
[Route("[controller]")]
[GuardModelState] // 在控制器级别应用过滤器
public class MyController : ControllerBase
{[HttpGet("{id}")]public ActionResult Get(int id){// 控制器逻辑return Ok();}[HttpPost][GuardModelState] // 在动作方法级别应用过滤器public ActionResult Post([FromBody] MyModel model){// 控制器逻辑return Ok();}
}

总结

GuardModelStateAttribute 是一个自定义的 ASP.NET Core 过滤器,用于在控制器动作执行前验证模型状态,并在模型状态无效时返回一个带有详细错误信息的 BadRequest 响应。通过使用这个过滤器,可以简化错误处理逻辑,并提高代码的可维护性和可读性。

相关文章:

.NET 自定义过滤器 - ActionFilterAttribute

这个代码片段定义了一个自定义的 ASP.NET Core 过滤器&#xff08;GuardModelStateAttribute&#xff09;&#xff0c;用于在控制器动作执行之前验证模型状态&#xff08;ModelState&#xff09;。如果模型状态无效&#xff0c;则构造一个 ProblemDetails 对象来描述错误&#…...

VMware Fusion Pro 13 for Mac虚拟机软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件 地址&#xff1a;www.macfxb.cn 二、开始安装 安装完成&#xff01;&#xff01;&#xff01;...

HarmonyOS应用开发环境搭建

本文主要讲述的是HarmonyOS应用开发环境的搭建&#xff0c;HUAWEI DevEco Studio是基于IntelliJ IDEA Community开源版本打造&#xff0c;为运行在HarmonyOS系统上的应用和服务提供一站式的开发平台。具体下载链接DevEco Studio 一、下载 DevEco Studio 只需要下载对应的版本&…...

YOLOv8改进实战 | 注意力篇 | 引入ICCV2023顶会LSKNet:大选择性卷积注意力模块LSKA,助力小目标检测

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前…...

00Mac安装playwright

文章目录 前言一、执行以下命令安装二、安装如果报错zsh: command not found: pip三、安装浏览器驱动 前言 现在常用的三个自动化测试&#xff08;或者爬虫&#xff09;库&#xff0c;是Selenium、Puppeteer、Playwright。Playwright是未来趋势&#xff0c;主要学习Playwright…...

materail3 CircularProgressIndicator和LinearProgressIndicator有难看的白块和断点

看看&#xff0c;就是这个垃圾效果&#xff1a; 圆圈的进度条有断点&#xff0c;不连接&#xff1b; 横线进度条&#xff0c;有尾部亮色&#xff0c;进度处又有分割。 它的原出处在这里&#xff1a;https://m3.material.io/components/progress-indicators/overview&#xff0…...

菜鸟入门Docker

初始Docker Docker的概念 Docker的用途 DOcke的安装 Docker架构 配置Docker镜像加速器 Docker常用命令 Docker服务相关的命令。 Docker镜像相关的命令 Docker容器相关的命令 容器的数据卷 数据卷的概念和作用 配置数据卷 Docker应用部署 Docker部署mysql Docker…...

什么是单片机?为什么要学习单片机?

实现目标 1、熟悉单片机定义、特点、应用场景、发展历史等&#xff1b; 2、理解为什么要学习单片机&#xff1f;怎样学习单片机&#xff1f; 一、单片机是什么&#xff1f; 1、定义 单片机是集成在一块&#xff08;单&#xff09;芯片上的微型计算机。平时我们把 MCU&#x…...

电子发射与气体导电

物理电磁学练习题&#xff1a;电子发射与气体导电 说明: 以下题目考察对电子发射和气体导电基本概念的理解和应用。 1. 解释以下概念&#xff1a; (a) 热电子发射 (b) 光电效应 © 逸出功 (d) 等离子体 2. 比较并对比热电子发射和光电效应的异同。 …...

【数据库】MySQL表的Updata(更新)和Delete(删除)操作

目录 1.Update 案例1&#xff1a;将孙悟空同学的数学成绩变更为 80 分 案例2&#xff1a;将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分 案例3&#xff1a;将总成绩倒数前三的 3 位同学的数学成绩加上 30 分 案例4&#xff1a;将所有同学的语文成绩…...

Unity Adressables 使用说明(六)加载(Load) Addressable Assets

【概述】Load Addressable Assets Addressables类提供了加载 Addressable assets 的方法。你可以一次加载一个资源或批量加载资源。为了识别要加载的资源&#xff0c;你需要向加载方法传递一个键或键列表。键可以是以下对象之一&#xff1a; Address&#xff1a;包含你分配给…...

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展&#xff0c;视频监控系统已成为现代社会安全防范的重要组成部分&#xff0c;广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略&#xff0c;不仅能够显著提升安全监控的效率和效果&#xff0c;还能在关键时刻提…...

Spark的Web界面

http://localhost:4040/jobs/ 在顶部导航栏上&#xff0c;可以点击以下选项来查看不同类型的Spark应用信息&#xff1a; Jobs - 此视图将列出所有已提交的作业&#xff0c;并提供每个作业的详细信息&#xff0c;如作业ID、名称、开始时间、结束时间等。Stages - 此视图可以查…...

语言中的内联

爸爸为了培养孩子的独立能力&#xff0c;会把任务交给孩子并观察孩子做的结果。但有的时候&#xff0c;妈妈看到孩子因为完不成而伤心难过时&#xff0c;会毫不犹豫二话不说帮孩子的事情做掉。这也是内联。 内联和宏 C/C宏可以提供内联同样的作用&#xff0c;没有额外函数调用…...

fail to install hcmon driver问题解决

对我搜集到的解决办法进行总结: 没有删除“C:\Windows\System32\drivers”&#xff09;下的 hcmon.sys 驱动文件,删除后重启后安装修改了注册表默认下载位置,使用winR输入regedit,将 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion这个路径下的都改为C…...

【NumPy】基础知识

NumPy是Python的第三方库&#xff0c;要使用需要先导入。 import numpy as np 在pycharm中可以通过np.来查看numpy的可用函数。 np.函数名? 查看对应函数的详细信息。 生成NumPy数组 ndarray 多维数组对象 numpy封装了一个新的数据类型ndarray&#xff0c;是一个多维数组对…...

传统CV算法——特征匹配算法

Brute-Force蛮力匹配 Brute-Force蛮力匹配是一种简单直接的模式识别方法&#xff0c;经常用于计算机视觉和数字图像处理领域中的特征匹配。该方法通过逐一比较目标图像中的所有特征点与源图像中的特征点来寻找最佳匹配。这种方法的主要步骤包括&#xff1a; 特征提取&#xff…...

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时&#xff0c;需要使用GPU加速&#xff0c;相关的CUDA和CUDNN安装好后&#xff0c;通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的&#xff0c;如果使用PyInstaller将.py文件打包为.exe&#xff0c;发现只能使用CPU推理了。 本文分析这个问题…...

Apache Pig

目录 一、配置说明1.本地模式2.集群模式 二、pig的数据模型三、pig的数据类型四、惰性执行五、pig的基本语法5.1语法说明5.2案例操作 六、pig的自定义函数 一、配置说明 1.本地模式 操作的是Linux系统文件 pig -x local关键日志 当前处于root目录下 2.集群模式 连接的是…...

axios返回的是promise对象如何处理?

axios返回的是promise对象如何处理&#xff1f; Axios返回的是Promise对象&#xff0c;这意味着可以使用Promise的.then()、.catch()和.finally()方法来处理异步操作的结果。 以下是处理Axios返回Promise对象的几种常见方式&#xff1a; 1、使用.then()处理响应数据&#xf…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...