0

当您直接调用控制器方法时,您将如何调用 ActionFilterAttribute?想象一下:

public class ApiController : Controller {

    public ActionResult CallSomething() {
         return IsCalled();
    }

    [MyAction]
    public ActionResult IsCalled() {
         return View();
    }
}

因此请求进入/Api/CallSomething,CallSomething() 方法在内部调用另一个方法(在本例中为 IsCalled()),但是当调用该方法时,ActionFilterAttribute 被调用并运行。

目前 ActionFilterAttribute 只有在它是原始请求的一部分时才会被调用,这是有道理的,因为它是整个 MVC 生命周期的一部分,我所做的只是直接调用一个方法,我需要做一个 RedirectToAction如果我想让它被 MVC 解雇。RedirectToAction 会更改 URL,因此这不适合我的目的。

我已经查看了 System.Web.Mvc 代码,但看不到它是如何或何时被调用的。我认为如果它可以做到,那么我也可以使用反射。在这种情况下,视图不相关,因为我重写了 ExecuteResult() 以将我自己的内容写入 http 响应。

无论如何,我已经让自己接受了这可能是不可能的,但我只是认为这值得一试。

4

2 回答 2

1

没有实际正确的方法可以实现这一目标。所以不要试图这样做。控制器操作不应像您的示例中那样称呼自己。在这种情况下使用重定向。或者,如果您不希望重定向,请让客户端将请求直接发送到第二个操作。

哦,如果您在想要重用的那些控制器操作之间有一些共同的功能,只需将此功能外部化到其他层。在 ASP.NET MVC 3 中提供通用功能的方法有很多种,具体取决于具体场景。

于 2012-06-21T13:31:50.837 回答
0

做你所说的最简单的方法就是把你想要作为过滤器和临时执行的功能分解出来。强制过滤器在不应该执行的地方执行是没有意义的。但是想要调用过滤器的某些部分可能是有意义的。最简单的方法是使用普通的旧静态方法:

public class ApiController : Controller {

    public ActionResult CallSomething() {
         MyActionFilter.CommonStaticMethodThatIsAlsoUsedInTheNormalFilter();
         return IsCalled();
    }

    [MyActionFilter]
    public ActionResult IsCalled() {
         return View();
    }
}

您应该更具体地了解您要实现的目标,框架的其他功能可能更适合。

于 2012-06-21T13:58:28.390 回答