2016-07-20 20 views
0

我有這樣的枚舉:如何在AuthorizeAttribute中使用枚舉razor mvc?

public enum PerfilUsuarioEnum 
{ 
    AdministradorSistema = 1, 
    AdministradorLoja = 2, 
    Gerente = 3 
} 

而且我想通過它在我的授權角色

[Authorize(Roles = PerfilUsuarioEnum.AdministradorLoja + ", " + PerfilUsuarioEnum.Gerente)] 

有某種方式來做到這一點?

回答

1

角色必須是常量表達式,如字符串。最簡單的方法是使用助理。

public static class PerfilUsuario 
{ 
    public const string AdministradorLoja = "AdministradorLoja"; 
    public const string Gerente = "NaviGerentegators"; 
} 

[Authorize(Roles = PerfilUsuario.AdministradorLoja + ", " + 
    PerfilUsuario.Gerente)] 
+0

有一些方法可以使用枚舉? –

+0

對不起,沒有其他辦法。在這種情況下,常量與Enum非常相似。 – Win

0

好問題。這是我做的...

我決定讓我的權限數據庫驅動,所以我需要一種方法來將字符串轉換爲「類型」的東西,以便我可以獲得編譯時警告,也可以更改名稱在數據庫中的權限,而不必更新我們所有的生產代碼。由於屬性是基於字符串的(所謂的魔術字符串),因此我決定不使用枚舉並使用T4腳本讀取數據庫併爲每條記錄生成一個結構。這使我還可以添加諸如顯示名稱,權限的詳細信息以及可顯示用戶的錯誤消息等內容。

這是T4模板運行後的示例權限行。

public struct CanViewClaimData 
{ 
    // Using const allows the compiler to generate the values in the assembly at compile time and satisfy MVC Authorize Attribute requirements for const strings. 
    public const System.String Name = "CanViewClaimData"; 
    public const System.String DisplayName = "Can View Claim Data"; 
    public const System.String Description = "The allows users to view claim data"; 
    public const System.String DefaultErrorMessage = "You must have the \"Can View Claim Data\" permission to access this feature."; 

} 

然後在代碼中我使用歸類授權子和標記的行動本身,

[Security.AuthorizedAttribute(Roles = CanViewClaimData.Name, Message = CanViewClaimData.DefaultErrorMessage)] 
每個自動生成過程中

然後推到我們的C.I.環境中,我運行T4模板作爲構建過程的一部分,以保持結構字符串與數據庫同步。

到目前爲止,這一切都非常有效,並允許我們的產品所有者能夠在數據庫中編輯權限名稱,說明等,而無需開發人員參與。