自定义ASP.NET MVC ActionFilterAttribute - 挂钩永远不会被调用

时间:2011-06-28 17:05:47

标签: c# asp.net-mvc actionfilterattribute

嗨,我正在尝试做一些看起来很简单的事情,并且有记录,但出于某些原因,它并不那么容易。

Basiclly我写了这样的东西:

public class CacheControllAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    { 
        //do something
        base.OnResultExecuting(filterContext);
    }
}

然而,当我尝试在这样的动作结果上使用它时:

[CacheControllAttribute]
public ActionResult SomeAction()
{
    //whatever
}

我的自定义覆盖功能永远不会被调用...

对此有何想法?或者如何以不同的方式实现这一点?

7 个答案:

答案 0 :(得分:25)

可能是一个愚蠢的建议,但你是否已将其添加到global.asax? 这是我的一个应用程序的示例:

public class MvcApplication : System.Web.HttpApplication     
{
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
    filters.Add(new LogonAuthorize());
    filters.Add(new HandleErrorAttribute());
  }
}

答案 1 :(得分:19)

我的错误是我引用了System.Web.Http.Filters,而不是System.Web.Mvc

答案 2 :(得分:4)

最后想通了,最后事实是我一直把过滤器放在一个实际上是一个ActionResult函数的函数上,但它是由另一个调用它的方法返回的,所以过滤器只是在入口点Action上执行一次。

答案 3 :(得分:1)

您是否尝试覆盖OnActionExecuting之类的内容:

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

这是我编写动作过滤器的方式,并且没有遇到调用它们的问题。

答案 4 :(得分:1)

您的代码通常对我很好。它可能与您在Action方法中正在做(或不做)的事情有关。如果您没有返回视图等,则可能未调用“ResultExecuting”事件处理程序。我会抓取示例here并查看为您的操作记录的内容。

答案 5 :(得分:0)

<强>思路:

你肯定你的过滤器没有运行吗?你有一个断点吗?你确定吗 它不是抛出和异常?你确定你装饰的动作实际上是在调用吗?

不同的实施:

覆盖控制器的OnResultExecuting方法。

答案 6 :(得分:0)

如果您看到继承“'ActionFilterAttribute'FilterAttributeIActionFilter”类的类IResultFilter的继承。您正在寻找的方法可在IResultFilter界面中找到。

因此,当我们使用自定义类作为属性时,它永远不会执行方法。我们始终需要在自定义实现方面覆盖所有IActionFilterIResultFilter方法。