2009-06-01 105 views
5

I asked a question今天早些时候在ASP.Net MVC中约ActionFilters。原来我的问题是我的ActionFilter甚至没有运行。除此之外,我读this article,我找不到他所做的任何事情。为什么我的ActionFilters没有运行?

这是我的代码:

// 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(); 
} 

在过滤方法,当我调试时从不打一个断点,TempData["filter"]持有视图时呈现的null值。

为什么这不起作用?

回答

4

根据您的意见,以另一种答案

当通过单元测试进行测试时,过滤器不会被调用。如果你想调用过滤器,那么你需要模仿ControllerActionInvoker。最好是单独测试过滤器本身,然后使用反射来确保将过滤器应用于具有正确属性的操作。我更喜欢这种机制,以结合测试过滤器和操作。

原始

当然,你在你的方法需要一个override否则你实际上并没有取代基类的方法。我本来期待编译器抱怨你需要一个newoverride就可以了。如果您不包含override关键字,则其行为与您使用new时相同。由于框架将其作为ActionFilterAttribute调用,这意味着您的方法永远不会被调用。

MSDN报价:

如果在派生类中的方法是 没有新的前面或覆盖 关键字,编译器会发出 警告,该方法将表现为 如果新的关键字在场。

+0

嗯......奇怪,它没有进入那里。我没有得到警告(直到我重新编译),但包括覆盖并没有改变情况:代码仍然没有运行。 – 2009-06-01 13:54:13

+0

你有做重建解决方案吗?也许一个图书馆已经过时了。如果您使用覆盖,我无法想象这不起作用。 – tvanfosson 2009-06-01 14:00:03

0

除了什么tvanofosson说,你的动作方法实际上并没有渲染任何东西的视图。您的观点是否有<%=TempData["Filter"].ToString()%>声明或类似的声明?

4

在情况下,它是有帮助的使用MVC 4/5的人:如果你得到你的ActionFilterAttributeIActionFilter错误的命名空间

ActionFilters不运行:https://stackoverflow.com/a/13710468/188926

使用System.Web.Http.Filters的Web API,标准MVC操作的System.Web.Mvc

正如在问题中,如果您弄错了过滤器属性,它将被忽略(无错误),这使得它很难诊断。