MVC 3直接调用Controller方法,还调用ActionFilterAttribute?

时间:2012-06-21 13:28:47

标签: c# asp.net-mvc-3

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

public class ApiController : Controller {

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

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

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

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

我讨论过System.Web.Mvc代码,但我无法看到它被调用的方式或时间。我想如果它可以做到那么我可以使用反射。在这种情况下,视图不相关,因为我覆盖ExecuteResult()以将我自己的内容写入http响应。

无论如何,我已经辞职了,这可能是不可能的,但我只是觉得值得一试。

2 个答案:

答案 0 :(得分:1)

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

哦,如果您想要重用这些控制器操作之间有一些共同的功能,只需将此功能外部化到其他层。根据具体情况,有许多方法可以在ASP.NET MVC 3中提供通用功能。

答案 1 :(得分:0)

执行所讨论的最简单方法就是将要执行的功能分解为过滤器和ad-hoc。强制过滤器执行它不应该执行的位置是没有意义的。但是想要在ad-hoc中调用过滤器的某些部分可能是有意义的。最简单的方法是使用普通的静态方法:

public class ApiController : Controller {

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

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

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

相关问题