Action过滤器属性和控制器继承之间的顺序

时间:2014-05-08 16:18:42

标签: c# asp.net-mvc inheritance asp.net-web-api action-filter

我有两个抽象的api控制器,看起来很像这样:

[BaseActionFilter]
public abstract class ApiBaseController : ApiController
{
}

[StackActionFilter]
public abstract class StackApiBaseController : ApiBaseController 
{
}

现在我正在使用2个动作过滤器来覆盖OnActionExecuting方法并执行一些业务逻辑。

现在,当我使用从ApiBaseController继承的控制器时,BaseActionFilter工作得很好。

当我使用从StackApiBaseController继承的控制器时,我遇到了问题。

我的问题StackActionFilter取决于BaseActionFilter的结果,在我的情况下,之前 BaseActionFilter跑(我认为“父亲”先跑)。

有什么方法可以在这里订一些订单吗?当我使用继承BaseActionFilter的控制器时,我希望StackActionFilterStackApiBaseController之前运行。

2 个答案:

答案 0 :(得分:0)

我相信如果你将BaseActionFilter添加到StackApiController,它们将按照它们的应用顺序执行。

答案 1 :(得分:0)

一种方法是使 StackActionFilterAttribute 继承自 BaseactionFilterAttribute ,并仅将 StackActionFilterAttribute 应用于 StackApiBaseController

然后,您可以通过在 StackApiActionFilterAttribute 中放置base.OnActionExecuting调用的位置来控制顺序。

        public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //HERE
        base.OnActionExecuting(actionContext);
        //OR HERE

这并不理想,因为您需要从 ApiBaseController 中取出 BaseactionFilterAttribute ,因此无法控制直接从继承的任何控制器上强制执行的通用功能ApiBaseController 但它确实提供了所述问题的解决方案。