2010-02-02 67 views
0

在ASP.NET MVC 2中,爲了保護控制器的動作,我創建了一個繼承自ActionFilterAttribute類的類RequirePermission。控制器的動作看起來像在ASP.NET MVC中保護控制器動作

[RequirePermission(permissions="CanView")] 

    public ActionResult List() 
    { 
     ... 
    } 

我有名字的枚舉Permissions

public enum Permissions { CanDoEdit, CanView, CanInsert } 

RequirePermission類看起來像

public class RequirePermission : ActionFilterAttribute 
    { 
     public string permissions; 
     string[] param = { "," }; 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 

      string[] requirePermissions = permissions.Split(param, StringSplitOptions.RemoveEmptyEntries); 


      if (requirePermissions.Contains(Permissions.CanDoEdit.ToString())) 
      { 
        //Check permission 
      } 
      if (requirePermissions.Contains(Permissions.CanView.ToString())) 
      { 
        //Check permission 
      } 
      if (requirePermissions.Contains(Permissions.CanInsert.ToString())) 
      { 
        //Check permission 
      } 
     } 
    } 

現在反而讓不同的屬性,我想用RequirePermission[RequirePermission(permissions=Permissions.CanView+","+Permissions.CanEdit)]這樣的屬性,以便我可以將它用於不同的場景。但編譯器會拋出以下錯誤。

的屬性參數必須是常量表達式,屬性參數類型

回答

4

的typeof運算表達式或數組創建表達式如何:

[Flags] 
public enum Permissions 
{ 
    CanDoEdit = 1 << 0, 
    CanView = 1 << 1, 
    CanInsert = 1 << 2 
} 

然後:

[RequirePermission(permissions = Permissions.CanView & Permissions.CanEdit)] 

最後驗證CanView是否已設置:

if ((requirePermissions & Permissions.CanView) == Permissions.CanView) 
{ 
    // The user has CanView permission 
} 
+0

非常感謝。 – Adeel 2010-02-02 11:26:49

+0

其實我使用'Permissions.CanView | Permissions.CanEdit'。我認爲它應該是'Permissions.CanView&Permissions.CanEdit'來表示用戶具有這兩個權限。 – 2010-02-02 12:08:09

+0

我認爲你錯了。要設置兩個權限,請使用 Permissions.CanView | Permissions.CanEdit。 但爲了避免覆蓋枚舉值,我已經設置了2的值。 – Adeel 2010-02-02 12:59:02