zoukankan      html  css  js  c++  java
  • 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>

    效果如下

  • 相关阅读:
    如何分析redis中的慢查询
    redis订阅关闭异常解决
    异常解决:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    linux下postgres的安装
    springboot tomcat配置参数列表
    如何把web.xml中的context-param、Servlet、Listener和Filter定义添加到SpringBoot中
    electron-builder 由于网络原因无法下载问题解决
    Handshake failed due to invalid Upgrade header: null 解决方案
    Linux-006-执行Shell脚本报错 $' ':command not found
    VUE-013-为elementUI 设置 tootip 宽度
  • 原文地址:https://www.cnblogs.com/wangleicode/p/5392838.html
Copyright © 2011-2022 走看看