当您直接调用控制器方法时,如何调用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响应。
无论如何,我已经辞职了,这可能是不可能的,但我只是觉得值得一试。
答案 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();
}
}
您应该更加具体地了解您要实现的目标,可能还有其他更适合的框架功能。