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. 简述ADO.NET命名空间

    system.data命名空间的类型 system.data命名空间的核心成员 命名空间 作用 Constraint  表示某个DataColumn对象的约束 DataColumn 表示某个DataT ...

  2. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

  3. centos7 ipaddr 无法查看虚拟机IP解决办法

    原因是: CentOS 7 默认是不启动网卡的 解决办法:https://blog.csdn.net/wxx729418277/article/details/79130649

  4. Maven初解--依赖查找方法

    Maven可以实现对项目中的JAR包的版本管理,项目组成员公用一个Maven仓库(通过配置Maven的setting.xml文件,本地仓库和远程仓库,如果在本地仓库没有找到依赖的JAR,就会从远程仓库 ...

  5. GridContrl 通用类

    using DevExpress.Data; using DevExpress.Utils; using DevExpress.XtraGrid.Views.Grid; using System; u ...

  6. js 更改对象属性名

    来自:https://segmentfault.com/q/1010000011923504 侵删 [ { "Id":"3972679ef2c04151972b376dd ...

  7. Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码

    Android项目开发中经常会遇见需要实现圆角或者圆形的图片功能,如果仅仅使用系统自带的ImageView控件显然无法实现此功能,所以通过系列文章的形式由简到繁全方位的介绍一下此功能的实现,巩固一下自 ...

  8. Android ble 蓝牙4.0 总结一

    本文介绍Android ble 蓝牙4.0,也就是说API level >= 18,且支持蓝牙4.0的手机才可以使用,如果手机系统版本API level < 18,也是用不了蓝牙4.0的哦 ...

  9. typescript中的泛型

    泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能. 在像C#和Ja ...

  10. SSM框架多数据源和AOP事务管理之间