c# - 自定义 MVC 控制器动作属性来检查和操作动作输入
问题描述
晚上好
我正在尝试改进我们的控制器验证;我的一些开发人员同事被迫在某些控制器上使用 [ValidateInput(false)],但现在我们需要对他们接受的参数进行更精细的检查。
我想要实现的是编写一个自定义验证属性来代替 [ValidateInput(false)] 来检查输入中的数据,并在可能的情况下更改它。所以像这样的控制器:
[HttpPost]
[ValidateInput(false)]
public JsonResult SetData(long id, string text1, string text2)
应该这样对待
[HttpPost]
[MyCustomAttribute]
public JsonResult SetData(long id, string text1, string text2)
我需要在我的属性代码中一一检查所有传入的参数,并根据它们的类型执行特定的检查和可能的转换:
MyCustomAttribute(context) {
//Extract somehow a list of parameters pars from the context
for (var i in pars) {
if (pars[i] is string) {
//Alter strings
((string)pars[i]).Replace("a", "x"); //Just an example
}
if (pars[i] is long) {
//Alter numbers
if ((long)pars[i] < 0) pars[i] = 0; //Just an example
}
}
}
属性逻辑内部的更改需要是永久性的,以便控制器的逻辑不需要关心允许值域之外的参数。这可能吗?我很抱歉我的属性技能很差,如果我的问题变得琐碎或荒谬。
解决方案
我设法解决了这个问题。它可以创建一个 ActionFilterAttribute ,其中在重写函数 OnActionExecuting 中可以分析和更改传递给函数的 ActionExecutingContext 的成员 ActionParameters ,如下所示:
public class MyAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Logic here
var myField = filterContext.ActionParameters["myField"];
}
}
ActionExecutingContext.ActionParameters 可以循环以在其所有成员中执行基于类型的检查/操作,或者如果其名称已知,则可以准时在其中之一中执行。
感谢您的关注。
推荐阅读
- sql - SQL:CASE WHEN 以 AVG() 作为条件时没有给出正确的输出
- javascript - 使用 sinon 存根 fs.promises.readFile()
- php - 登录和注册重定向 - 在 WooCommerce 的结帐页面上时不要重定向登录
- javascript - 如何在我的 html 代码中激活 tomtom 的自动完成选项?
- python - 如何包含来自同一文件夹的另一个 python 文件
- influxdb - Flux 查询语言中 SELECT first(column), last(column) 的等价物是什么?
- c# - 如何解析文本文件并在其他两个文件之间找到一个字符串
- node.js - 如何使用nodejs删除猫鼬对象数组中的特定元素?
- amazon-web-services - 如何限制对 Amazon s3 静态网站中单个文件的访问
- obd-ii - OBD2 - 0x7E8 消息大于 8 字节 - ISO 15765-2