首页 > 解决方案 > 自定义 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
      }
   }
}

属性逻辑内部的更改需要是永久性的,以便控制器的逻辑不需要关心允许值域之外的参数。这可能吗?我很抱歉我的属性技能很差,如果我的问题变得琐碎或荒谬。

标签: c#asp.net-mvc

解决方案


我设法解决了这个问题。它可以创建一个 ActionFilterAttribute ,其中在重写函数 OnActionExecuting 中可以分析和更改传递给函数的 ActionExecutingContext 的成员 ActionParameters ,如下所示:

public class MyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Logic here
        var myField = filterContext.ActionParameters["myField"];
    }
}

ActionExecutingContext.ActionParameters 可以循环以在其所有成员中执行基于类型的检查/操作,或者如果其名称已知,则可以准时在其中之一中执行。

感谢您的关注。


推荐阅读