それらをアクションからコントローラー クラスまたは管理者アクションの基本コントローラー クラスに移動することを検討できます。そうすれば、個々のアクション メソッドではなく、コントローラ クラスでAuthorizeと属性の両方を設定するだけです。AdminLayout
[Authorize]
[AdminLayout]
public AdminController: Controller
{
//action methods
}
承認といくつかのカスタム レイアウト ロジックを組み合わせた属性を持つことは、単一責任の原則の破綻と見なされる可能性がありますが、他に選択肢がない場合は、次のアプローチを試すことができます。
AdminLayoutAttribute既存のものを新しいに置き換えたい場合AdminAttributeは、 を作成しAdminAttributeて標準から継承しAuthorizeAttribute、カスタム AdminLayoutAttribute のように IActionFilter\IResultFilter を実装することもできます。
public class AdminLayoutAttribute: AuthorizeAttribute, IActionFilter, IResultFilter
{
//Logic as in existing AdminLayoutAttribute to be replaced
}
それ以外の場合は、既存のものを保持し、それを と組み合わせAdminLayoutAttributeた新しいものを追加する場合は、カスタム属性から継承し、タイプ AuthorizationFilter の内部インスタンスを呼び出して IAuthorizationFilter を実装できます。AdminAttributeAuthorizeAttribute
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);
}
}
両方のオプションで重要なのは、C# では多重継承がサポートされていないため、新しい AdminAttribute クラスが 2 つの具象クラスから継承されないようにすることです。