【问题标题】:How do I pass variables to a custom ActionFilter in ASP.NET MVC app如何将变量传递给 ASP.NET MVC 应用程序中的自定义 ActionFilter
【发布时间】:2024-05-20 06:35:02
【问题描述】:

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

I read this tutorial 来理解和编写我自己的动作过滤器。问题是如何将变量从控制器传递到动作过滤器?

  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
    }
}

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

【问题讨论】:

  • 看看HttpActionExecutedContext参数的ActionContext属性。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


【解决方案1】:

方法 - 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();
}

【讨论】:

  • 我一直忙于其他事情,只是让这件事为我工作。谢谢PKKG! :)
  • @divyanshm :太好了。
  • 好的,所以我才意识到没有使用 ViewBag 传递变量。在我的项目控制器 C1 调用 c2,它调用 C3。我正在为 C2 做这个,它并没有完全了解它。在这种情况下如何访问变量。
  • 如何从 filterContext.Controller.ViewBag > DynamicView > ControllerVariable 中检索值?
  • @Ovis 使用var mystring = filterContext.Controller.ViewBag.MyViewbagThing;
【解决方案2】:

我建议另一种方法,它是将参数传递给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);
        }
    }
}

Which Permissions 是 ENUM 之类的:

enum Permissions {NewUser, Edit, Delete, Update, ...}

【讨论】:

    最近更新 更多