【问题标题】:Custom ASP.NET MVC ActionFilterAttribute - hooks never get called自定义 ASP.NET MVC ActionFilterAttribute - 永远不会调用挂钩
【发布时间】:2011-09-24 12:27:34
【问题描述】:

您好,我正在尝试做一些看似简单的事情,并且以这种方式记录在案,但由于某种原因,它并不那么容易。

基本上我是这样写的:

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

但是,当我尝试在这样的操作结果上使用它时:

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

我的自定义覆盖函数永远不会被调用...

对此有什么想法吗?或者如何以不同的方式实现?

【问题讨论】:

  • 好像没问题。您使用的是哪个 MVC 版本?
  • 这是 MVC 2,我开始认为可能是其他东西阻止了过滤器执行或类似的事情,这是否可以像整个执行流程一样以某种方式进行追踪?
  • 我遇到了完全相同的问题。即使我在 globalFilterCollection 中添加了过滤器,我也收到了一个错误,我应该实现 IActionFilter。过了一会儿,我发现我使用的是 System.Web.**Http.Filters**.IActionFilter 和 System.Web.**Http.Filters**.ActionFilterAttribute 而不是正确的 System.Web.**Mvc* *.IActionFilter 和 System.Web.**Mvc**.ActionFilterAttribute 可能会对某人有所帮助。

标签: c# asp.net-mvc actionfilterattribute


【解决方案1】:

想法:

您确定您的过滤器没有运行吗?你在里面设置了断点吗?你确定吗 它不是抛出和异常吗?你确定你装饰的动作真的被调用了吗?

不同的实现方式:

覆盖控制器的OnResultExecuting 方法。

【讨论】:

  • 是的,我实际上所做的是在我的 ActionResult 函数和自定义过滤器上都有一个断点,但是调试器只会到达 ActionResult 函数上的断点
【解决方案2】:

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

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

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

【讨论】:

  • 已尝试覆盖执行的操作,但似乎没有任何区别......它仍然没有被调用是否需要像 web.config 或类似的任何进一步配置?
  • @aromasca - 不需要 web.config 条目。你确定你的动作被调用了吗?您是否在过滤器中设置了断点以查看是否命中?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      终于弄明白了,到底是我把过滤器放在了一个实际上是 ActionResult 函数的函数上,但是它是由另一个调用它的方法返回的,所以过滤器只是被在入口点 Action 上执行一次。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 非常感谢 Yara。我也犯了同样的错误,我从你的评论中学到了。因此,给你一票。 :-)
        • 似乎是第一个参考 resharper 去
        • 同样的问题!谢谢你的提示。是 Resharper 的错误
        【解决方案7】:

        如果您看到类'ActionFilterAttribute' 的继承,它继承了“FilterAttributeIActionFilterIResultFilter”类。你要找的方法在IResultFilter接口中可以找到。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-18
          • 2021-12-07
          • 2012-08-03
          • 1970-01-01
          • 2016-01-16
          • 2012-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多