为什么我的ActionFilters没有运行?
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
值。
为什么这不起作用?
根据您的意见,以另一种答案
当通过单元测试进行测试时,过滤器不会被调用。如果你想调用过滤器,那么你需要模仿ControllerActionInvoker。最好是单独测试过滤器本身,然后使用反射来确保将过滤器应用于具有正确属性的操作。我更喜欢这种机制,以结合测试过滤器和操作。
原始
当然,你在你的方法需要一个override
否则你实际上并没有取代基类的方法。我本来期待编译器抱怨你需要一个new
或override
就可以了。如果您不包含override
关键字,则其行为与您使用new
时相同。由于框架将其作为ActionFilterAttribute调用,这意味着您的方法永远不会被调用。
从MSDN报价:
如果在派生类中的方法是 没有新的前面或覆盖 关键字,编译器会发出 警告,该方法将表现为 如果新的关键字在场。
除了什么tvanofosson说,你的动作方法实际上并没有渲染任何东西的视图。您的观点是否有<%=TempData["Filter"].ToString()%>
声明或类似的声明?
在情况下,它是有帮助的使用MVC 4/5的人:如果你得到你的ActionFilterAttribute
或IActionFilter
错误的命名空间
ActionFilters不运行:https://*.com/a/13710468/188926
使用System.Web.Http.Filters
的Web API,标准MVC操作的System.Web.Mvc
。
正如在问题中,如果您弄错了过滤器属性,它将被忽略(无错误),这使得它很难诊断。
嗯......奇怪,它没有进入那里。我没有得到警告(直到我重新编译),但包括覆盖并没有改变情况:代码仍然没有运行。 – 2009-06-01 13:54:13
你有做重建解决方案吗?也许一个图书馆已经过时了。如果您使用覆盖,我无法想象这不起作用。 – tvanfosson 2009-06-01 14:00:03