我有以下设置。在GuestDetailsController中执行操作时,如何在[RequireCheckoutAvailability] 之前运行[LoadThemeInfo]而不必在子控制器的属性上指定订单?过滤器都使用OnActionExecuting。
[LoadThemeInfo(Order=1)]
public class MgControllerBase : Controller
{
}
[RequireCheckoutAvailability(Order=2)]
public class GuestDetailsController : MgControllerBase
{
}
从msdn: Order属性采用一个必须为0(默认值)或更大的整数值,但有一个例外。省略Order属性会为过滤器提供-1的订单值,表示未指定的顺序。 Order属性设置为-1的作用域中的任何操作过滤器将以未确定的顺序执行,但在具有指定顺序的过滤器之前执行。
在这种情况下,我希望在具有指定顺序的那些之后执行未指定的。还有另一种方法可以做我想要实现的目标吗?也许从属性和其他地方移出加载主题信息代码?
答案 0 :(得分:4)
在属性的构造函数中设置顺序。为了将执行订单保留在一个位置并在添加新属性时使其易于维护,请创建enum
,例如:
public enum CustomActionFilterOrder{
LoadThemeInfo = 1,
RequireCheckoutAvailability = 2,
}
,属性构造函数看起来像
public RequireCheckoutAvailability(){
this.Order = (int)CustomActionFilterOrder.RequireCheckoutAvailability;
}
答案 1 :(得分:0)
将ActionFilterAttribute从基本控制器中取出并从重写的OnActionExecuting调用它使其比子控制器上的属性更早执行。
public class MgControllerBase : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var filter = new LoadThemeInfoFilter(DependencyLookup.Resolve<IBrandContext>());
filter.OnActionExecuting(filterContext);
base.OnActionExecuting(filterContext);
}
}
[RequireCheckoutAvailability]
public class GuestDetailsController : MgControllerBase
{
}