17

我创建了两个类来实现AuthorizeAttribute动作筛选器执行顺序

一个是全球使用,我就定它的Global.asax.cs中:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 }); 

另一种方式叫做SecondAuthorizeAttribute,它是在一些操作方法只用,我用它作为属性我想要的方法。

[HttpGet] 
    [SecondAuthorize] 
    public ActionResult LogOut() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.Abandon(); 
     return Redirect(Url.Content("~/")); 
    } 

的问题是,SecondAuthorizeAttribute总是FirstAuthorizeAttribute之前执行,我需要这个先执行。该命令没有帮助,我怎么能做到这一点?

回答

3

顺序没有的Global.asax.cs文件的工作。 如果需求是订单,然后转到控制器或操作方法,并给。 例如: -

[secondAttribute(顺序= 1)] [firstAttribute(顺序= 2)]

HomeController中:控制器

公共的ActionResult指数()

15

@ HectorCorrea的答案中的链接目前已经死亡,下面是从当前Google缓存中检索并总结的内容(如果情况也是如此):

过滤器执行顺序是:

  • 授权过滤
  • 行动过滤器
  • 响应/结果过滤器
  • 异常过滤器

在每一个过滤器,你可以指定Order属性。 (所有过滤器派生自抽象类FilterAttribute,并且此类具有Order属性)。该属性将确保过滤器以特定顺序运行。

如:

[AuthorizationFilterA(Order=2)] 
[AuthorizationFilterB(Order=1)] 
public ActionResult Index() 
{   
    return View(); 
} 

还有FilterScope,默认情况下,用最低的范围过滤器第一次运行时的顺序是一样的(或不指定):

namespace System.Web.Mvc { 
    public enum FilterScope { 
     First = 0, 
     Global = 10, 
     Controller = 20, 
     Action = 30, 
     Last = 100, 
    } 
} 

如果没有订单被指定,订单值为-1(首先,不是最后)。

控制器本身可以是过滤器,将与顺序运行Int32.MinValue

+2

请记住,异常过滤器以相反的顺序运行(当然它们是这样做的!),因此对于那些过滤器的最高范围运行 – levelnis