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