abp添加动态菜单

abp中MenuDefinition封装了导航栏上的主菜单的属性,MenuItemDefinition则封装了子菜单的属性,子菜单可以引用其他子菜单构成一个菜单树。

MenuDefinitio成员如下:

    public object CustomData { get; set; }//自定义数据
       
    public ILocalizableString DisplayName { get; set; }//表示本地化字符串
       
    public IList<MenuItemDefinition> Items { get; set; }//子级菜单集合
       
    public string Name { get; }//菜单名称

    public MenuDefinition AddItem(MenuItemDefinition menuItem);//子菜单添加方法

 MenuItemDefinition成员如下:

    public object CustomData { get; set; }//自定义数据
        
       public ILocalizableString DisplayName { get; set; }//表示本地化字符串
       
       public IFeatureDependency FeatureDependency { get; set; }//功能特性
        
       public string Icon { get; set; }//菜单图标
        
       public bool IsLeaf { get; }//是否有子菜单
        
       public virtual IList<MenuItemDefinition> Items { get; }//子菜单
       
       public string Name { get; }//菜单名称
        
       public int Order { get; set; }//排序
        
       public string RequiredPermissionName { get; set; }//权限名称
        
       public bool RequiresAuthentication { get; set; }//权限验证如果通过验证显示此菜单否则不可见
        
       public string Url { get; set; }//URL

       public MenuItemDefinition AddItem(MenuItemDefinition menuItem);//添加子菜单

有了以属性并了解其作用我们可以方便自定任何菜单,在常规开发中我们可能需要从数据库,xml等数据源中加载一些动态菜单来满足我们的系统要求,有了以上对象我们可以方便的添加菜单!

设置菜单代码如下:

 public class AppNavigationProvider : NavigationProvider
    {
        public override void SetNavigation(INavigationProviderContext context)
        {
            #region 静态菜单

            context.Manager.MainMenu
                .AddItem(new MenuItemDefinition(
                    AppPageNames.Host.Tenants,
                    L("HostDashboardMenu"),
                    url: "host_dashboard",
                    icon: "menu-icon fa fa-home",
                    requiredPermissionName: PermissionNames.Pages_Host_Dashboard,
                    order: 1
                    )
                );

            #endregion

            #region 动态菜单
            
            var project=new MenuItemDefinition(
                    AppPageNames.Common.Project,
                    L("ProjectMenu"),
                    url: "roles",
                    icon: "menu-icon fa fa-briefcase",
                    requiredPermissionName: PermissionNames.Pages_Administration_Projects,
                    order: 5
                    );
              
            //这里模拟从数据库加载数据
            for (int i = 1; i <= 10; i++)
            {
                project.AddItem(new MenuItemDefinition(
                       "p1",
                       L("项目" + i),
                       url: "project",
                       icon: "menu-icon fa fa-tasks",
                       requiredPermissionName: PermissionNames.Pages_Administration_Projects,
                       customData: i
                   ));
            }
            context.Manager.MainMenu.AddItem(project);
            #endregion
           
        }

        private static ILocalizableString L(string name)
        {
            return new LocalizableString(name, DataCenterConsts.LocalizationSourceName);
        }
    }

前端代码(前端根据不同框架处理方式有所不同,这里以angular为例):

<ul class="nav sidebar-menu">

    <li ng-repeat="menuItem in vm.menu.items|orderBy:'order'" ui-sref-active="active">
        <!--无子级导航-->
        <a ui-sref="{{menuItem.url}}" ng-if="!menuItem.items.length">
            <i class="{{menuItem.icon}}"></i>
            <span class="menu-text"> {{menuItem.displayName}} </span>
        </a>
        <!--有子级导航-->
        <a href="javascript:void()" class="menu-dropdown" ng-if="menuItem.items.length">
            <i class="{{menuItem.icon}}"></i>
            <span class="menu-text"> {{menuItem.displayName}} </span>
            <i class="menu-expand"></i>
        </a>
        <ul class="submenu" ng-if="menuItem.items.length">
            <li ui-sref-active="active" ng-repeat="childMenuItem in menuItem.items">
                <!--动态URL-->
                <a ui-sref="project.details({id:childMenuItem.customData})" ng-if="childMenuItem.customData">
                    <i class="{{childMenuItem.icon}}"></i>
                    <span class="menu-text">{{childMenuItem.displayName}}</span>
                </a>
                <!--静态URL-->
                <a ui-sref="{{childMenuItem.url}}" ng-if="!childMenuItem.customData">
                    <i class="{{childMenuItem.icon}}"></i>
                    <span class="menu-text">{{childMenuItem.displayName}}</span>
                </a>
            </li>
        </ul>
    </li>
</ul>

效果如下

原文地址:https://www.cnblogs.com/wangleicode/p/5392838.html