【问题标题】:Role based menu angularJs using JSON使用 JSON 的基于角色的菜单 angularJs
【发布时间】:2019-04-12 17:08:57
【问题描述】:

我使用 AngularJS 从 JSON 创建了一个菜单。我想根据分配给用户的角色显示或隐藏它。我有两个角色,AdminHeadQuarter。我只想向 HeadQuarter 角色显示管理库存和销售库存菜单,并且只向 Admin 角色显示销售库存

这是我的代码:

$scope.Menu = [
    {
        Name: 'Manage Inventory',
        SubMenu: [{
            Name: 'Manage Products',
            Link: { Action: 'SearchProduct', Controller: 'Inventory' }
        }, {
            Name: 'Manage SubCategories',
            Link: { Action: 'SearchSubCategory', Controller: 'Inventory' }
        }, {
            Name: 'Manage Categories',
            Link: { Action: 'SearchCategory', Controller: 'Inventory' }
        }, {
            Name: 'Manage Departments',
            Link: { Action: 'SearchDepartment', Controller: 'Inventory' }
        }, {
            Name: 'View/Print Inventory',
            Link: { Action: 'SearchInventory', Controller: 'Inventory' }
        }, {
            Name: 'Stock Taking',
            Link: { Action: 'StockTaking', Controller: 'Inventory' }
        }]
},
{
        Name: 'Sales',
        SubMenu: [{
            Name: 'Sale Products',
            Link: { Action: 'SearchProduct', Controller: 'Inventory' }
        }, {
            Name: 'Manage SubCategories',
            Link: { Action: 'SearchSubCategory', Controller: 'Inventory' }
        }, {
            Name: 'Sale Categories',
            Link: { Action: 'SearchCategory', Controller: 'Inventory' }
        }, {
            Name: 'Sale Departments',
            Link: { Action: 'SearchDepartment', Controller: 'Inventory' }
        }, {
            Name: 'View/Print Inventory',
            Link: { Action: 'SearchInventory', Controller: 'Inventory' }
        }, {
            Name: 'Stock Taking',
            Link: { Action: 'StockTaking', Controller: 'Inventory' }
        }]
}

];

我在这里获得角色:

var _hrole = @Html.Raw(Json.Encode(ViewContext.HttpContext.User.IsInRole("HeadQuarter")));
    var _wrole = @Html.Raw(Json.Encode(ViewContext.HttpContext.User.IsInRole("Admin")));

_hrole_wrole 是布尔值,它们是真还是假,具体取决于角色。

这是我的 HTML 代码:

<ul class="nav navbar-nav">
    <li class="dropdown" ng-repeat="r in Menu">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{r.Name}}</a>
        <ul class="dropdown-menu" ng-include="'_nestedMenuTemplate'" ng-init="Menu = r.SubMenu"></ul>
     </li>
</ul>

【问题讨论】:

  • _hrole_wrole 不会是 boolean - 它们是 string。如果您想要boolean,请使用var _hrole = @Html.Raw(Json.Encode(ViewContext.HttpContext.User.IsInRole("HeadQuarter")))
  • 感谢指正。我现在是真还是假,但仍然不知道如何显示隐藏它
  • 修复代码缩进后,您似乎在$scope.Menu 中缺少一个闭合的} 大括号。
  • 您提供了带有菜单数据的代码,我看到您有变量来确定人员的角色。我没有看到任何试图实际显示或隐藏菜单的代码。您尝试了哪些方法,取得了哪些成果?
  • 基本上我不知道显示隐藏它这就是为什么我在这里发布一个问题来帮助我实现我的目标。如果可以的话,请

标签: jquery angularjs json asp.net-mvc


【解决方案1】:

您可以使用_hrole 值来切换显示样式,如下所示:

<ul class="nav navbar-nav" style="@Html.Raw(Json.Encode(ViewContext.HttpContext.User.IsInRole("HeadQuarter")) ? "display:block" : "display:none")">

另一种选择是添加一个简单的 jQuery 调用,根据 _hrole 的值切换导航栏的可见性。

最简单的方法是在导航栏中添加一个 id ul item:

<ul id="menu" class="nav navbar-nav">

您的 jQuery 代码将如下所示:

if(_hrole) {
    $('#menu').show();
}
else {
    $('#menu').hide();
}

【讨论】:

  • 只有html文件为什么你可以使用@Html.Raw?
  • 我还有其他菜单项也显示给管理员角色
  • @ShamshadJamal 好的,那么有第二个变量是有意义的,尽管它与这个问题并没有真正的关系。我从我的答案中删除了那部分。
  • @ShamshadJamal 您添加的数据与问题有什么关系。菜单中的实际数据是无关紧要的,不是吗?
  • @thanhdung0312 由于 OP 使用了它,我假设他们使用的是带有 ASP.NET MVC 的 Razor,而不仅仅是纯 HTML。
【解决方案2】:

你可以这样引用:

第 1 步:您必须配置需要显示的菜单。如果菜单具有该角色,UI 将显示它,其他任何东西都隐藏它。您将 RoleShowMenu 字段添加到 $scope.Menu。此字段包含角色将显示。

$scope.Menu = [
    {
        Name: 'Manage Inventory',
        RoleShowMenu : ['HeadQuarter']
        SubMenu: [{
            Name: 'Manage Products',
            Link: { Action: 'SearchProduct', Controller: 'Inventory' }
        }, {
            Name: 'Manage SubCategories',
            Link: { Action: 'SearchSubCategory', Controller: 'Inventory' }
        }, {
            Name: 'Manage Categories',
            Link: { Action: 'SearchCategory', Controller: 'Inventory' }
        }, {
            Name: 'Manage Departments',
            Link: { Action: 'SearchDepartment', Controller: 'Inventory' }
        }, {
            Name: 'View/Print Inventory',
            Link: { Action: 'SearchInventory', Controller: 'Inventory' }
        }, {
            Name: 'Stock Taking',
            Link: { Action: 'StockTaking', Controller: 'Inventory' }
        }]
},
{
        Name: 'Sales',
        RoleShowMenu : ['Admin', 'HeadQuarter']
        SubMenu: [{
            Name: 'Sale Products',
            Link: { Action: 'SearchProduct', Controller: 'Inventory' }
        }, {
            Name: 'Manage SubCategories',
            Link: { Action: 'SearchSubCategory', Controller: 'Inventory' }
        }, {
            Name: 'Sale Categories',
            Link: { Action: 'SearchCategory', Controller: 'Inventory' }
        }, {
            Name: 'Sale Departments',
            Link: { Action: 'SearchDepartment', Controller: 'Inventory' }
        }, {
            Name: 'View/Print Inventory',
            Link: { Action: 'SearchInventory', Controller: 'Inventory' }
        }, {
            Name: 'Stock Taking',
            Link: { Action: 'StockTaking', Controller: 'Inventory' }
        }]
}
];

第 2 步:顺便说一下,您必须在设置为 $rootScope 后获得用户登录角色。使用 $rootScope 缓存数据。 例如,当 XXX 用户登录时,您将获得 XXX' 角色用户。要获得角色,您可以调用 Rest API 或任何方式。假设 XXX 用户具有“HeadQuarter”角色。

$rootScope.rolesUserLogin = 'HeadQuarter';

第 3 步:创建按角色检查显示/隐藏菜单的功能:

$rootScope.hasRole = function (roleShowMenu) {
    for (var i=0; i< roleShowMenu.length; i++) {
        if (roleShowMenu[i] === $rootScope.rolesUserLogin ) {
            return true;
        }
    }
    return false;
};

第四步:申请HTML

<ul class="nav navbar-nav">
    <li class="dropdown" ng-repeat="r in Menu">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" ng-if="hasRole(r.RoleShowMenu)">{{r.Name}}</a>
        <ul class="dropdown-menu" ng-include="'_nestedMenuTemplate'" ng-init="Menu = r.SubMenu" ng-if="hasRole(r.RoleShowMenu)"></ul>
     </li>
</ul>

【讨论】:

  • 我已经实现了代码,但它总是给我 undefined return false
  • 在 html 页面上,RoleShowMenu 参数的值是多少?你可以帮我分享一下
  • 其总部或管理员取决于角色
  • 运行app时,可以调试到angularjs中的hasRole并查看结果方法
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 2016-06-12
  • 1970-01-01
  • 2023-03-19
  • 2023-03-30
  • 2018-11-10
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多