关于ABP框架NavigationProvider在Asp.net Core+AngularJS3.6.0模板的使用疑问
我之前在ABP 3.x版本里也遇到过这个问题,当时找了好一会儿才发现版本间的菜单配置方式变了,我来给你捋清楚解决方案:
ABP 3.x版本对菜单配置的方式做了调整,不再需要单独创建继承NavigationProvider的类,而是把菜单配置整合到了模块类的ConfigureNavigation方法中。默认模板里可能只配置了基础菜单,所以你没看到明显的菜单扩展代码。
服务端定义菜单的具体步骤
- 找到你的Web模块类(一般命名为
[YourProjectName]WebModule),如果没有重写ConfigureNavigation方法,就直接重写它(基类AbpModule有这个虚方法):
public override void ConfigureNavigation(NavigationConfiguration context) { // 先检查主菜单是否已初始化,避免重复添加 if (context.Manager.MainMenu.Items.Count == 0) { // 添加首页菜单 context.Manager.MainMenu.AddItem(new MenuItemDefinition( PageNames.Home, L("HomePage"), // 本地化键,对应你的本地化资源文件 url: "", icon: "fa fa-home", requiresAuthentication: false )); // 添加租户管理菜单(需要权限) context.Manager.MainMenu.AddItem(new MenuItemDefinition( PageNames.Tenants, L("Tenants"), url: "Tenants", icon: "fa fa-building", requiredPermissionName: PermissionNames.Pages_Tenants )); // 这里可以添加你的自定义菜单,比如: context.Manager.MainMenu.AddItem(new MenuItemDefinition( "MyCustomMenu", L("MyCustomMenuName"), url: "MyCustomPage", icon: "fa fa-cog", requiredPermissionName: "MyProject.Pages.MyCustomPage" ).AddItem(new MenuItemDefinition( // 添加子菜单 "MySubMenu", L("MySubMenuName"), url: "MyCustomPage/SubPage" ))); } }
- 菜单名称的本地化:在项目的
Localization目录下的资源文件(比如[YourProjectName].xml)中添加对应的键值对,确保客户端能显示正确的本地化文本:
<text name="MyCustomMenuName">我的自定义菜单</text> <text name="MySubMenuName">子菜单</text>
ABP会自动把服务端定义的菜单同步到客户端的abp.nav.menus.MainMenu对象中,你只需要在AngularJS代码中调用这个对象并渲染即可。
- 在导航栏的控制器中获取菜单数据:
(function () { angular.module('app').controller('NavBarController', [ '$scope', function ($scope) { // 直接获取服务端同步过来的主菜单 $scope.mainMenu = abp.nav.menus.MainMenu; // 可选:如果需要处理菜单(比如过滤隐藏项),可以在这里操作 $scope.menuItems = $scope.mainMenu.items.filter(item => !item.isHidden); } ]); })();
- 在HTML视图中循环渲染菜单(以默认的导航栏为例):
<ul class="nav navbar-nav" ng-controller="NavBarController"> <li ng-repeat="item in menuItems" ng-class="{'active': isCurrentMenuItem(item), 'dropdown': item.items.length > 0}"> <a ng-if="item.items.length === 0" ng-href="#{{item.url}}"> <i class="{{item.icon}}"></i> <span>{{item.displayName}}</span> </a> <!-- 处理带下拉子菜单的项 --> <a ng-if="item.items.length > 0" class="dropdown-toggle" data-toggle="dropdown"> <i class="{{item.icon}}"></i> <span>{{item.displayName}}</span> <b class="caret"></b> </a> <ul ng-if="item.items.length > 0" class="dropdown-menu"> <li ng-repeat="subItem in item.items"> <a ng-href="#{{subItem.url}}">{{subItem.displayName}}</a> </li> </ul> </li> </ul>
- 注意事项:
isCurrentMenuItem是模板自带的辅助方法,用来判断当前路由是否匹配菜单项URL,你可以直接使用,或者自己实现逻辑- 服务端配置的权限会自动生效,客户端拿到的
abp.nav.menus.MainMenu已经过滤掉当前用户无权限访问的菜单项,不需要额外处理权限判断
内容的提问来源于stack exchange,提问作者user2058413
相关产品推荐
相关产品推荐

