自定义ASP.NET MVC ActionFilterAttribute - 钩子从未被调用

16

你好,我试图做一些看起来很简单的事情,并且有相应的文档,但是不知道为什么它并不那么容易。

基本上,我写了类似于这样的代码:

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

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

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

我的自定义重载函数从未被调用...

有没有关于这个问题的想法?或者如何以不同的方式实现它?


看起来没问题。你使用的是哪个MVC版本? - LeftyX
这是MVC 2,我开始觉得可能有其他东西阻止了过滤器的执行或类似的事情,这是否可以像整个执行流程一样被追踪? - aromasca
我曾经遇到过完全相同的问题。即使我在globalFilterCollection中添加了过滤器,我仍然收到一个错误,提示我应该实现IActionFilter接口。过了一会儿,我发现我使用的是System.Web.Http.Filters.IActionFilter和System.Web.Http.Filters.ActionFilterAttribute,而不是正确的System.Web.Mvc.IActionFilter和System.Web.Mvc.ActionFilterAttribute。也许这会帮助到某些人。 - Maarten Kieft
7个回答

28

也许这个建议有点愚蠢,但你是否已将它添加到你的 global.asax 中?
这是我一个应用程序的示例:

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

20

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


4
非常感谢您,Yara。我也犯了同样的错误,从您的评论中学到了东西。因此,给您点赞。 :-) - Ashok kumar
1
似乎是resharper首选的第一个引用 - Hoody
1
同样的问题在这里!感谢您的提示。这是Resharper的错误。 - Korayem

5

最终弄清楚了,问题在于我一直在对一个ActionResult函数添加过滤器,但实际上它是由另一个调用它的方法返回的,因此这些过滤器只会在入口Action上执行一次。


1

你尝试过重写 OnActionExecuting 方法吗:

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

这是我编写操作过滤器的方式,我从未遇到过它们被调用的问题。


尝试重写执行动作,但似乎没有任何区别...它仍然没有被调用。是否还需要进一步配置,比如在web.config文件或其他地方? - aromasca
@aromasca - 不需要web.config条目。你确定你的操作被调用了吗?你设置了断点在你的过滤器中看看是否被触发了吗? - amurra

1

你的代码看起来总体上不错。问题可能与你在Action方法中所做的事情(或未做的事情)有关。如果你没有返回视图等,那么你的“ResultExecuting”事件处理程序可能没有被调用。我建议你获取这里的示例,并查看你的操作记录了什么。


0

想法:

你确定你的过滤器没有运行吗?你在它里面设置了断点吗?你确定它没有抛出异常吗?你确定你装饰的操作实际上被调用了吗?

不同的实现方式:

重写控制器的OnResultExecuting方法。


是的,我实际上在我的ActionResult函数和自定义过滤器上都设置了断点,但调试器只能到达ActionResult函数上的断点。 - aromasca

0

如果你看到类'ActionFilterAttribute'继承了"FilterAttributeIActionFilterIResultFilter"这些类。你要找的方法在IResultFilter接口中。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接