您可以考虑将它们从操作移至控制器类或用于管理操作的基本控制器类。这样,您只需在控制器类中设置 Authorize 和 AdminLayout 属性,而不是每个单独的操作方法。
[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);
}
}
这两个选项的关键是不让新的 AdminAttribute 类继承自 2 个具体类,因为 C# 不支持多重继承。