嗨,我正在尝试做一些看起来很简单的事情,并且有记录,但出于某些原因,它并不那么容易。
Basiclly我写了这样的东西:
public class CacheControllAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//do something
base.OnResultExecuting(filterContext);
}
}
然而,当我尝试在这样的动作结果上使用它时:
[CacheControllAttribute]
public ActionResult SomeAction()
{
//whatever
}
我的自定义覆盖功能永远不会被调用...
对此有何想法?或者如何以不同的方式实现这一点?
答案 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'
,FilterAttribute
,IActionFilter
”类的类IResultFilter
的继承。您正在寻找的方法可在IResultFilter
界面中找到。
因此,当我们使用自定义类作为属性时,它永远不会执行方法。我们始终需要在自定义实现方面覆盖所有IActionFilter
和IResultFilter
方法。