为什么我的ActionFilters都没有运行?

Tom*_*han 8 asp.net-mvc action-filter

我今天早些时候在ASP.Net MVC中提出了一个问题ActionFilters.事实证明我的问题确实是我ActionFilter甚至没有跑步.我阅读这篇文章的其他内容,我找不到他做的任何我不做的事情.

这是我的代码:

// The ActionFilter itself
public class TestingIfItWorksAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.TempData["filter"] = "it worked!";
        base.OnActionExecuting(filterContext);
    }
}

// The Controller Action with the filter applied
[TestingIfItWorks]
public ActionResult Test()
{
    var didit = TempData["filter"];
    return View();
}
Run Code Online (Sandbox Code Playgroud)

我在调试时永远不会遇到过滤器方法中的断点,并TempData["filter"]null呈现视图时保留一个值.

为什么这不起作用?

Dun*_*unc 9

如果它对使用MVC 4/5的任何人有帮助:

如果你得到的命名空间ActionFilters不运行ActionFilterAttributeIActionFilter错:/sf/answers/959732791/

使用System.Web.Http.Filters的Web API,System.Web.Mvc用于标准的MVC行动.

在问题中,如果你弄错了,过滤器属性将被忽略(没有错误),这使得诊断变得困难.


tva*_*son 5

根据您对另一个答案的评论

通过单元测试进行测试时,不会调用过滤器。如果要调用过滤器,则需要模拟 ControllerActionInvoker。最好是单独测试过滤器本身,然后使用反射来确保过滤器以正确的属性应用于您的操作。我更喜欢这种机制,而不是结合测试过滤器和动作。

原来的

当然override,您的方法上需要一个,否则您实际上并没有替换基类上的方法。我原以为编译器会抱怨您需要 anewoverrideon 。如果您不包含override关键字,它将表现得如同您使用了new. 由于框架将它作为 ActionFilterAttribute 调用,这意味着您的方法将永远不会被调用。

引用自MSDN

如果派生类中的方法前面没有 new 或 override 关键字,编译器将发出警告,并且该方法的行为就像存在 new 关键字一样。