首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在菜单栏中显示特定的选项,只对具有管理角色的用户显示?

如何在菜单栏中显示特定的选项,只对具有管理角色的用户显示?
EN

Stack Overflow用户
提问于 2011-12-03 19:25:21
回答 3查看 1.5K关注 0票数 0

我正在开发一个web应用程序,它向管理员显示一个不同于普通用户的菜单栏。我的意思是,如果用户是管理员,他会看到一些与系统本身的设置相关的选项。我将菜单栏创建为用户控件(ascx),并在其代码隐藏中找到以下方法:

代码语言:javascript
运行
复制
public bool DisplayAdminOnlyMenuItems
    {
        get { return menuItem1ToHide.Visible; }
        set
        {
            menuItem1ToHide.Visible = value;
        }
    }

然后在site.master页面中,我将菜单栏用户控件设置为DisplayAdminMenuItems为false。

在代码隐藏中,我使用以下逻辑:

代码语言:javascript
运行
复制
if(user.username == "John"){
    MenuBar1.DisplayAdminOnlyMenuItems = true;
}

一切都很好。现在,我有了新的要求,这使我的生活有点复杂。我的数据库中有三个表,结构如下:

用户表:名称、用户名、部门(用户名是主键)

角色表: RoleID,RoleName (RoleID是主键)

UserRole表: UserRoleID,用户名,RoleID (UserRoleID是主键)

我有三个角色:管理员、组织者和用户--我只想为拥有Admin角色的用户显示Admin菜单,那么我怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2011-12-03 19:33:51

代码语言:javascript
运行
复制
if(user.username == "John"){
    MenuBar1.DisplayAdminOnlyMenuItems = true;
}

上面使用的方法是不正确的,因为它是不可伸缩的。如果有两个管理员呢?你会给每个管理员一个或一个条件吗?

正确的方法是您基于角色而不是用户的新需求。

当您得到一个用户,检查它的角色和显示UI的基础上的角色

代码语言:javascript
运行
复制
if(user.RoleName == "Admin"){
    MenuBar1.DisplayAdminOnlyMenuItems = true;
}

如果你有RoleName的话,我想你可以得到UserName

票数 0
EN

Stack Overflow用户

发布于 2011-12-03 20:14:03

您应该做的是向您的用户类添加一两个新的方法来执行这个逻辑,这样您就不会对角色的引用散布在代码中,从而可以容纳未来的更改。

例如,如果您下周收到添加超级管理角色的请求,并且该角色还应该能够访问管理角色功能,而不给用户分配管理角色,那么您将很难更新代码。

但是,如果将这样的方法添加到用户类中:

代码语言:javascript
运行
复制
public const string ADMIN_ROLE = "ADMIN";
public const string SUPER_ADMIN_ROLE = "SUPERADMIN";

public bool HasAdminAuthority() {
   // Assuming roles are not indexed by name
   foreach (string sRole in this.Roles) {
      switch (sRole.ToUpper()) {
          case ADMIN_ROLE:
             return true;

          case SUPER_ADMIN_ROLE:
             return true;

      }
   }

   return false;
}

另一个有用的添加方法是这样的:

代码语言:javascript
运行
复制
public bool IsInRole(string sRoleToFind) {

   foreach (string sRole in this.Roles) {
      if (sRoleToFind.Equals(sRole, StringComparison.InvariantCultureIgnoreCase) {
         return true;
      }
   }
   return false;
}

然后,您可以在UI逻辑中使用这些方法之一来控制行为(我强烈推荐第一个方法)。

还请注意,在上述两个示例中,例如,如果用户中的角色在字典中,则可以用字典上的.ContainsKey方法调用替换循环。

票数 0
EN

Stack Overflow用户

发布于 2011-12-03 22:27:29

您可以使用LoginView控件。

代码语言:javascript
运行
复制
<asp:LoginView ID="lgvAdmins" runat="server">
     <asp:rolegroup roles="Administrators">
          <contenttemplate>
               ...controls...
          </contenttemplate>
     </rolegroup>
     <asp:rolegroup roles="Users">
          <contenttemplate>
               ...controls...
          </contenttemplate>
     </rolegroup>
</asp:LoginView>

不过,我认为您需要在您的RoleManager中启用web.config。还可以为匿名和其他正常登录用户指定控件。或者您可以使用Application_BeginRequest获取用户的角色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8370313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档