You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于ABP框架NavigationProvider在Asp.net Core+AngularJS3.6.0模板的使用疑问

我之前在ABP 3.x版本里也遇到过这个问题,当时找了好一会儿才发现版本间的菜单配置方式变了,我来给你捋清楚解决方案:

为什么找不到NavigationProvider?

ABP 3.x版本对菜单配置的方式做了调整,不再需要单独创建继承NavigationProvider的类,而是把菜单配置整合到了模块类的ConfigureNavigation方法中。默认模板里可能只配置了基础菜单,所以你没看到明显的菜单扩展代码。

服务端定义菜单的具体步骤
  1. 找到你的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"
        )));
    }
}
  1. 菜单名称的本地化:在项目的Localization目录下的资源文件(比如[YourProjectName].xml)中添加对应的键值对,确保客户端能显示正确的本地化文本:
<text name="MyCustomMenuName">我的自定义菜单</text>
<text name="MySubMenuName">子菜单</text>
客户端用abp.nav.menus.MainMenu生成菜单

ABP会自动把服务端定义的菜单同步到客户端的abp.nav.menus.MainMenu对象中,你只需要在AngularJS代码中调用这个对象并渲染即可。

  1. 在导航栏的控制器中获取菜单数据:
(function () {
    angular.module('app').controller('NavBarController', [
        '$scope',
        function ($scope) {
            // 直接获取服务端同步过来的主菜单
            $scope.mainMenu = abp.nav.menus.MainMenu;
            
            // 可选:如果需要处理菜单(比如过滤隐藏项),可以在这里操作
            $scope.menuItems = $scope.mainMenu.items.filter(item => !item.isHidden);
        }
    ]);
})();
  1. 在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>
  1. 注意事项:
  • isCurrentMenuItem是模板自带的辅助方法,用来判断当前路由是否匹配菜单项URL,你可以直接使用,或者自己实现逻辑
  • 服务端配置的权限会自动生效,客户端拿到的abp.nav.menus.MainMenu已经过滤掉当前用户无权限访问的菜单项,不需要额外处理权限判断

内容的提问来源于stack exchange,提问作者user2058413

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:09:58