2010-02-02 64 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