Asp.net mvc 为什么我的ActionFilter都不运行?

Asp.net mvc 为什么我的ActionFilter都不运行?,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,我今天早些时候谈到了ASP.NETMVC中的ActionFilters。原来我的问题是我的ActionFilter甚至没有运行。在我读过的其他东西中,我找不到他做的任何我不做的事情 这是我的代码: // The ActionFilter itself public class TestingIfItWorksAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingC

我今天早些时候谈到了ASP.NETMVC中的
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();
}
当我调试时,filter方法中的断点永远不会命中,并且在呈现视图时,
TempData[“filter”]
持有一个
null


为什么不起作用?

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

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

原创

当然,您需要在方法上使用
重写
,否则实际上不会替换基类上的方法。我原以为编译器会抱怨您需要对其进行
新建
覆盖
。如果不包括
覆盖
关键字,它的行为将与使用
新建
一样。由于框架将其作为ActionFilterAttribute调用,这意味着您的方法永远不会被调用

引述自:

如果派生类中的方法是 不在新的或覆盖之前 关键字,编译器将发出 警告,该方法的行为如下所示 如果存在新关键字


除了tvanofosson所说的,您的动作方法实际上并没有向视图呈现任何内容。您的视图是否有
语句或类似的内容?

以防它对任何使用MVC 4/5的人都有帮助:

如果您的
ActionFilterAttribute
IActionFilter
的命名空间错误,则ActionFilters不会运行:

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


如问题中所述,如果您的过滤器属性出错,它将被忽略(无错误),这使得诊断变得困难。

Hm。。。奇怪的是它没有进入那里。我没有收到警告(直到我重新编译),但包含覆盖并没有改变这种情况:代码仍然无法运行。您是否执行了重建解决方案?也许图书馆已经过时了。我无法想象如果你使用超控,这会不起作用。谢谢!大约在同一时间,我通过启动一个新的、干净的项目,添加必要的测试(一个控制器、一个过滤器、一个视图和一个测试),发现了同样的问题。我将分别在网上查找有关单元测试ActionFilters的信息,如果我(再次)失败,我将返回一个新问题。非常感谢!=)不,我实际上看不见。我在控制器的ActionResult方法中有一个断点,在过滤器的OnActionExecuting方法中有一个断点,还有一个调用该操作的UnitTest。我点击“调试测试”并在控制器操作中停止,但没有在过滤器操作中停止。此外,单元测试尝试断言TempData[“filter”]=“it worked!”,但失败了。Aha——该属性不是从单元测试中调用的,它仅在操作执行器调用该方法时由MVC框架调用。