Asp.net mvc 调用FilterAttribute';在BaseController'之前执行的操作;s操作执行

Asp.net mvc 调用FilterAttribute';在BaseController'之前执行的操作;s操作执行,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,我有一个BaseController,通过覆盖OnActionExecuting在ViewData集合中放入一些数据 现在我在ChildController中有一个操作,它不需要该视图数据 为此,我创建了一个DontPopulateViewDataactionfilterate属性,该属性在BaseController上设置bool,以防止BaseController填充viewdata 问题:ActionFiltersOnActionExecuting方法在BaseController中的方法

我有一个
BaseController
,通过覆盖
OnActionExecuting
ViewData
集合中放入一些数据

现在我在
ChildController
中有一个操作,它不需要该视图数据

为此,我创建了一个
DontPopulateViewData
actionfilterate属性,该属性在
BaseController
上设置bool,以防止
BaseController
填充viewdata

问题:ActionFilters
OnActionExecuting
方法在
BaseController
中的方法之后而不是之前调用


在基本控制器中,ActionFilters是否总是在重写操作执行之前被调用?有没有办法解决这个问题?

ActionFilterAttribute类有一个名为“Order”的属性,您可以使用该属性设置操作筛选器的执行顺序。
在您的情况下,必须将BaseController中的Filter属性顺序设置为2,将DerivedController中的Filter属性顺序设置为1:

[MyFilter(Order=2)]
public class BaseController:Controller
{

  public ActionResult MyAction() {

  }

}

[MySecondFilter(Order=1)]
public class DerivedController:BaseController
{

  public ActionResult AnotherAction() {

  }

}
有关更多信息,请阅读以下内容:


注意:我没有对此进行测试。

除了Marwan Aouida发布和建议的内容(在基类上使用ActionFilter),我认为您无法创建在基类上的OnActionExecuting()重载之前执行的ActionFilter。以下代码:

 [MyActionFilter(Name = "Base", Order = 2)]
 public class MyBaseController : Controller
 {
     protected override void OnActionExecuting(ActionExecutingContext filterContext)
     {
        Response.Write("MyBaseController::OnActionExecuting()<br>");
        base.OnActionExecuting(filterContext);
     }

     protected override void Execute(System.Web.Routing.RequestContext requestContext)
     {
        requestContext.HttpContext.Response.Write("MyBaseController::Execute()<br>");
        base.Execute(requestContext);
     }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        Response.Write("MyBaseController::OnActionExecuted()<br>");
        base.OnActionExecuted(filterContext);
    }
 }

 public class MyActionFilter : ActionFilterAttribute
 {
    public string Name;

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Write("MyActionFilter_" + Name + "::OnActionExecuted()<br>");
        base.OnActionExecuted(filterContext);
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Write("MyActionFilter_" + Name + "::OnActionExecuting()<br>");
        base.OnActionExecuting(filterContext);
    }
 }

 public class MyTestController : MyBaseController
 {
     [MyActionFilter(Name = "Derived", Order = 1)]
     public void Index()
     {
        Response.Write("MyTestController::Index()<br>");
     }
 }

谢谢是的,将逻辑放入基类上的ActionFilter中可以解决问题,甚至可以得到更干净的设计。
MyBaseController::Execute()
MyBaseController::OnActionExecuting()
MyActionFilter_Derived::OnActionExecuting()
MyActionFilter_Base::OnActionExecuting()
MyTestController::Index()
MyActionFilter_Base::OnActionExecuted()
MyActionFilter_Derived::OnActionExecuted()
MyBaseController::OnActionExecuted()