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
问题:ActionFiltersOnActionExecuting
方法在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()