26

我的 MVC 应用程序中有一个控制器,我正在尝试使用 onResultExecuted 方法使用自定义 ActionFilterAttribute 记录详细信息。

我阅读本教程是为了理解和编写我自己的动作过滤器。问题是如何将变量从控制器传递到动作过滤器?

  1. 我想获取调用控制器的输入变量。比如说,用户名/用户 ID。
  2. 如果(在某些情况下)任何控制器方法抛出异常,我也想记录错误。

控制器——

[MyActionFilter]
public class myController : ApiController {
    public string Get(string x, int y) { .. }
    public string somemethod { .. }
}

动作过滤器 -

public class MyActionFilterAttribute : ActionFilterAttribute {
    public override void onActionExecuted(HttpActionExecutedContext actionExecutedContext) {
        // HOW DO I ACCESS THE VARIABLES OF THE CONTROLLER HERE
        // I NEED TO LOG THE EXCEPTIONS AND THE PARAMETERS PASSED TO THE CONTROLLER METHOD
    }
}

我希望我已经解释了这里的问题。抱歉,如果我在这里遗漏了一些基本对象,我对此完全陌生。

4

2 回答 2

75

方法 - 1

动作过滤器

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
    }
}

动作方法

[MyActionFilter]
public ActionResult Index()
{
    ViewBag.ControllerVariable = "12";
    return View();
}

在此处输入图像描述

如果你注意截图,你可以看到ViewBag信息

方法 - 2

动作过滤器

public class MyActionFilter : ActionFilterAttribute
{
    //Your Properties in Action Filter
    public string Property1 { get; set; }
    public string Property2 { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }
}

动作方法

[MyActionFilter(Property1 = "Value1", Property2 = "Value2")]
public ActionResult Index()
{
    return View();
}
于 2013-08-13T13:04:07.680 回答
0

我建议另一种方法,它将参数传递给Action Filter构造函数。

[PermissionCheck(Permissions.NewUser)]
public ActionResult NewUser()
{
 // some code
}

然后在 ActionFilter 中:

public class PermissionCheck : ActionFilterAttribute
{
    public Permissions Permission { get; set; }
    public PermissionCheck(Permissions permission)
    {
        Permission = permission;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        
        
        if (/*user doesn't have that permission*/)
        {

            filterContext.Result = new RedirectToRouteResult
           (
               new RouteValueDictionary
                   (
                       new {
                           controller = "User",
                           action = "AccessDeny",
                           error = "You don't have permission to do this action"
                       }
                   )
           );
            base.OnActionExecuting(filterContext);
        }
    }
}

哪个 Permissions 是一个 ENUM,例如:

enum Permissions {NewUser, Edit, Delete, Update, ...}
于 2021-08-16T14:15:04.240 回答