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:
)
); #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:
); //这里模拟从数据库加载数据
for (int i = ; i <= ; 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>

效果如下

abp添加动态菜单的更多相关文章

  1. 【ABP】 动态菜单修改过程asp.netcore+vue

    无论用什么框架,第一件事情就是实现动态菜单,从数据库中读取菜单配置项输出前台,网上翻了一大堆翻译文档,也看了官方英文文档,关键点在于如何实现NavigationProvider和在前端调用abp.na ...

  2. WinForm------GridControl右键添加动态菜单

    转载:http://www.devexpresscn.com/Resources/Documentation-440.html 更加好用的方法: 1.添加一个GridControl控件,PopupMe ...

  3. .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)

    我们来创建动态菜单吧 首先,先对动态菜单的概念.操作.流程进行约束:1.Host和各个Tenant有自己的自定义菜单2.Host和各个Tenant的权限与自定义菜单相关联2.Tenant有一套默认的菜 ...

  4. .net core3.1 abp动态菜单和动态权限(思路) (二)

    ps:本文需要先把abp的源码下载一份来下,跟着一起找实现,更容易懂 在abp中,对于权限和菜单使用静态来管理,菜单的加载是在登陆页面的地方(具体是怎么知道的,浏览器按F12,然后去sources中去 ...

  5. Java动态菜单添加

    自己做出来的添加数据库配置好的动态菜单的方法 private void createMenu() {  IMenuDAO dao = new MenuDAOImpl();  String sql1 = ...

  6. Abp添加菜单

    Abp添加菜单 在abp模板中添加菜单,EntityFramework+Angular.js模板,使用的Abp版本为3.8.1. 创建Abp项目模板,例如名称叫做LawAndRegulation. 服 ...

  7. DevExpress使用教程:XtraGridControl动态添加右键菜单

    在使用 GridControl 的时候经常需要添加右键菜单.一般的做法是自己创建菜单项,然后注册GridView的Mouse-Click事件,然后Show出定义好的菜单.但是涉及到一些单击事件会收到编 ...

  8. ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  9. ABP框架 - 动态Web Api层

    文档目录 本节内容: 创建动态Web Api控制器 ForAll 方法 重写 ForAll ForMethods Http 动词 WithVerb 方法 HTTP 特性 命名约定 Api 浏览器 Re ...

随机推荐

  1. CVE-2017-1000405 利用脏牛漏洞Linux提权复现

    当前路径: /var/www 磁盘列表: / 系统信息: Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 ...

  2. js基础复习点

    1.变量   var num=10;       var num1,num2,num3;   num1=10;   num2=20;   num3=30;       var num1=10,num2 ...

  3. 1920*1080pc端适配

    (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...

  4. MyBatis学习---整合SpringMVC

    [目录]

  5. ext整合highcharts实现饼图

    extjs自身有图表的功能,但是与highcharts和echarts相比,ext不如它们功能强大.样式美观. 公司项目的前端框架使用的是ext,所以就有了ext整合第三方图表插件的需求. 笔者会一点 ...

  6. There is already an object named '#xxxx' in the database.

    这个案例是前几天同事遇到的一个案例,在存储过程中"删除"了一个临时表,然后重新创建这个临时表时遇到"There is already an object named 'x ...

  7. Jenkins 配置 Git 错误解决:CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt

    错误信息: Failed to connect to repository : Command "C:/tools/Git/bin/git.exe ls-remote -h https:/X ...

  8. 关于 insufficient memory case 4 的解决记录

    用户在上传图片的时候,系统会报异常 insufficient memory case 4,追踪代码发生在jdk中 image.io 的 read() 方法.这是一个耽搁了很久的bug,客户反馈了好几次 ...

  9. SQL Server 2017连接数据库

    1.服务器类型需为[数据库引擎] 若为[Analysis Services],连接后是无法建立数据库的. 2.需确定服务器名称,未显示已注册的服务器,则需: (1)请在“视图”菜单中,单击“已注册的服 ...

  10. python3.6新特性

    print(f'{6:^30}') print('\n'.join([' '.join([f'{i}*{j}={i*j:2d}' for j in range(1,i+1)]) for i in ra ...