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. C#保留2位小数几种场景总结

    场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.25.可不可以刚好保留到最后一位不是 ...

  2. Docker 容器镜像删除

    1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker ...

  3. activemq配置安装

    1.了解JMS查看百度百科 https://baike.baidu.com/item/JMS/2836691?fr=aladdin 2.了解ActiveMQ https://baike.baidu.c ...

  4. js中console使用2

    接着上一篇js中console使用1,本片继续介绍js中console的用法 测试代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...

  5. [代码笔记]JS保持函数单一职责,灵活组合

    比如下面的代码,从服务端请求回来的订单数据如下,需要进行以下处理1.根据 status 进行对应值得显示(0-进行中,1-已完成,2-订单异常)2.把 startTime 由时间戳显示成 yyyy-m ...

  6. Spark MLlib FPGrowth关联规则算法

    一.简介 FPGrowth算法是关联分析算法,它采取如下分治策略:将提供频繁项集的数据库压缩到一棵频繁模式树(FP-tree),但仍保留项集关联信息.在算法中使用了一种称为频繁模式树(Frequent ...

  7. EF6实现软删除

    https://www.jianshu.com/p/c65fbfe16e1a

  8. Windows上安装MySQL的完整教程

    1.     首先去官方网站下载压缩文件:https://dev.mysql.com/downloads/mysql/ 2.     解压下载的文件. 3.     将解压的所有文件放在一个文件夹里( ...

  9. 自定义react数据验证组件

    我们在做前端表单提交时,经常会遇到要对表单中的数据进行校验的问题.如果用户提交的数据不合法,例如格式不正确.非数字类型.超过最大长度.是否必填项.最大值和最小值等等,我们需要在相应的地方给出提示信息. ...

  10. coursea机器学习课程作业

    coursea机器学习课程作业 一 关于此课程 课程地址 图片来自网络 1.官网课程地址传送 2.如果访问官网速度较慢可以上 B站课程地址 机器学习是一门研究在非特定编程条件下让计算机采取行动的学科. ...