【问题标题】:Why do none of my ActionFilters run?为什么我的所有 ActionFilter 都不运行?
【发布时间】:2024-05-23 15:05:02
【问题描述】:

我今天早些时候asked a question 在 ASP.Net MVC 中讨论 ActionFilters。原来我的问题真的是我的ActionFilter 甚至没有运行。除其他外,我阅读了this article,但我找不到他做的任何我不做的事情。

这是我的代码:

// 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 值。

为什么这不起作用?

【问题讨论】:

    标签: asp.net-mvc action-filter


    【解决方案1】:

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

    如果您的 ActionFilterAttributeIActionFilter 的命名空间错误,则 ActionFilters 不会运行:https://*.com/a/13710468/188926

    System.Web.Http.Filters 用于 Web API,System.Web.Mvc 用于标准 MVC 操作。

    与问题一样,如果您弄错了 filter 属性,它将被简单地忽略(没有错误),这使得诊断变得困难。

    【讨论】:

      【解决方案2】:

      根据你的 cmets 给另一个答案

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

      原创

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

      引用MSDN:

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

      【讨论】:

      • 嗯...奇怪的是它没有进入那里。我没有收到警告(直到我重新编译),但包括覆盖并没有改变情况:代码仍然没有运行。
      • 您是否进行了重建解决方案?也许图书馆已经过时了。如果您使用覆盖,我无法想象这不起作用。
      • 谢谢!我几乎在同一时间开始了一个新的、干净的项目,只添加了测试所需的东西(控制器、过滤器、视图和测试),我发现了同样的事情。我将在网上四处寻找有关分别对 ActionFilters 进行单元测试的一些信息,如果我(再次)失败,我会提出一个新问题。非常感谢! =)
      【解决方案3】:

      除了 tvanofosson 所说的之外,您的操作方法实际上并没有向视图呈现任何内容。您的视图中是否有 <%=TempData["Filter"].ToString()%> 声明或类似内容?

      【讨论】:

      • 不,我实际上没有意见。我在控制器的 ActionResult 方法中有一个断点,在过滤器的 OnActionExecuting 方法中有一个断点,还有一个调用动作的 UnitTest。我点击“调试测试”并在控制器操作中停止,但不是在过滤器操作中。此外,单元测试尝试断言 TempData["filter"] == "it working!",但失败了。
      • 啊哈——该属性不是从单元测试中调用的,它仅在动作执行器调用该方法时由 MVC 框架调用。
      最近更新 更多