早期的ActionFilterAttribute在基本控制器中执行 - MVC2

时间:2011-03-02 23:29:40

标签: asp.net-mvc-2 inheritance actionfilterattribute

我有以下设置。在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的作用域中的任何操作过滤器将以未确定的顺序执行,但在具有指定顺序的过滤器之前执行。

在这种情况下,我希望在具有指定顺序的那些之后执行未指定的。还有另一种方法可以做我想要实现的目标吗?也许从属性和其他地方移出加载主题信息代码?

2 个答案:

答案 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
{

}