1

我正在尝试编写一个属性类,该类可以用于我的所有“管理员”动作,然后将所有相关动作/授权过滤器有效地应用于该动作。例如,我总是应用AuthoriseAttribute和自定义AdminLayoutAttribute,所以我的意图是只有一个AdminAttribute,这暗示了以上两点。这样我可以在一个方便的地方对整个管理部分进行更改。MVC3:分组动作过滤器或调用来自其他动作过滤器的动作过滤器

但是我不明白我该如何做到这一点。任何一个人都可以指向正确的方向吗?

非常感谢。

回答

3

您可以考虑将它们从操作移到管理员操作的控制器类或基本控制器类。这样,您只需在控制器类中设置AuthorizeAdminLayout属性,而不是每个单独的操作方法。

[Authorize] 
[AdminLayout] 
public AdminController: Controller 
{ 
    //action methods 
} 

有合并的授权和一些自定义的布局逻辑的属性可以被看作是单一职责原则的突破,但如果你没有其他选择,那么你可以尝试以下方法:

如果您想用新的AdminAttribute代替现有的AdminLayoutAttribute,则可以创建AdminAttribute,以便它继承标准AuthorizeAttribute,并且还像在自定义AdminLayoutAttribute中一样实现IActionFilter \ IResultFilter。

public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter 
{ 
    //Logic as in existing AdminLayoutAttribute to be replaced 
} 

否则,如果你想保持现有的AdminLayoutAttribute并添加新的AdminAttribute,与AuthorizeAttribute结合它,然后你可以从你的自定义属性继承,并通过调用类型AuthorizationFilter的内部实例实现个IAuthorizationFilter

public class AdminLayoutAttribute: AdminLayoutAttribute, IAuthorizationFilter 
{ 
    //Implement IAuthorizationFilter by delegating to an internal AuthorizeFilter instance 
    private _authorizeFilter = new AuthorizeAttribute(); 

    public override object TypeId 
    { 
     //override from base Attribute class as in AuthorizeAttribute class 
     get { return _authorizeFilter.TypeId ; } 
    } 

    public string Roles 
    { 
     get { return _authorizeFilter.Roles; } 
     set { _authorizeFilter.Roles = value; } 
    } 

    public string Users 
    { 
     get { return _authorizeFilter.Users; } 
     set { _authorizeFilter.Users = value; } 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     _authorizeFilter.OnAuthorization(filterContext); 
    } 

} 

这两个选项中的关键是没有从2个具体类继承新的AdminAttribute类,因为C#不支持多继承。

+0

谢谢丹尼尔,我会给它一个。 – hofnarwillie