abp(net core)+easyui+efcore实现仓储管理系统目录 
<https://www.cnblogs.com/chillsrc/p/11231284.html>
abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) 
<https://www.cnblogs.com/chillsrc/p/10913047.html>
abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) 
<https://www.cnblogs.com/chillsrc/p/10944870.html>
abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三) 
<https://www.cnblogs.com/chillsrc/p/10980974.html>
 abp(net core)+easyui+efcore实现仓储管理系统——定义仓储并实现 (四) 
<https://www.cnblogs.com/chillsrc/p/11024357.html>
abp(net core)+easyui+efcore实现仓储管理系统——创建应用服务(五) 
<https://www.cnblogs.com/chillsrc/p/11065667.html>
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之控制器(六) 
<https://www.cnblogs.com/chillsrc/p/11096690.html>
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七) 
<https://www.cnblogs.com/chillsrc/p/11124614.html>
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八) 
<https://www.cnblogs.com/chillsrc/p/11159642.html>
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九) 
<https://www.cnblogs.com/chillsrc/p/11195189.html>
abp(net core)+easyui+efcore实现仓储管理系统——多语言(十) 
<https://www.cnblogs.com/chillsrc/p/11231265.html>
abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十一) 
<https://www.cnblogs.com/chillsrc/p/11269737.html>
 abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二) 
<https://www.cnblogs.com/chillsrc/p/11303125.html>
 abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十三)  
<https://www.cnblogs.com/chillsrc/p/11341288.html>
abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十四)  
<https://www.cnblogs.com/chillsrc/p/11377940.html>
 abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十五)  
<https://www.cnblogs.com/chillsrc/p/11413522.html>
 
 
      在前面的文章(abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九)  
<https://www.cnblogs.com/chillsrc/p/11195189.html>
)中我们学会了如何添加静态菜单,但是做为一个信息管理系统,总不能每次有新功能新菜单,都静态添加菜单,编译,再上线。我们希望的是有一个菜单管理界面,在此页面中输入相应的菜单,只要我们重新登录,菜单就自动显示在菜单栏中。而菜单的来源可以是多样的,可以从需要从数据库,xml等数据源中加载一些动态菜单来满足我们的系统要求。
今天我们就来实现这个功能,动态加载菜单。所要加载的菜单就是模块管理中的功能模块。
一、菜单项类
       
一个应用程序可能包含不同的模块,而每个模块都可能有它自己的菜单项。在Abp中,需要创建一个派生自NavigationProvider的类来定义一个菜单项。例如我们这个项目中的TPLMSNavigationProvider类。代码如下。
 
using Abp.Application.Navigation; using Abp.Localization; using 
ABP.TPLMS.Authorization;namespace ABP.TPLMS.Web.Startup { /// <summary> /// 
This class defines menus for the application./// </summary> public class 
TPLMSNavigationProvider : NavigationProvider {public override void 
SetNavigation(INavigationProviderContext context) { context.Manager.MainMenu 
.AddItem(new MenuItemDefinition( PageNames.Home, L("HomePage"), url: "", icon: "
home", requiresAuthentication: true ) ).AddItem( new MenuItemDefinition( 
PageNames.Tenants, L("Tenants"), url: "Tenants", icon: "business", 
requiredPermissionName: PermissionNames.Pages_Tenants ) ).AddItem(new 
MenuItemDefinition( PageNames.Users, L("Users"), url: "Users", icon: "people", 
requiredPermissionName: PermissionNames.Pages_Users ) ).AddItem(new 
MenuItemDefinition( PageNames.Roles, L("Roles"), url: "Roles", icon: "
local_offer", requiredPermissionName: PermissionNames.Pages_Roles ) ) .AddItem( 
new MenuItemDefinition( PageNames.Module, L("Module"), url: "Module", icon: "
local_offer" ) ) .AddItem( new MenuItemDefinition( PageNames.Supplier, L("
Supplier"), url: "Supplier", icon: "people" ) ) .AddItem( new 
MenuItemDefinition( PageNames.About, L("About"), url: "About", icon: "info" ) 
).AddItem(// Menu items below is just for demonstration! new MenuItemDefinition(
"MultiLevelMenu", L("MultiLevelMenu"), icon: "menu" ).AddItem( new 
MenuItemDefinition("AspNetBoilerplate", new FixedLocalizableString("ASP.NET 
Boilerplate") ).AddItem( new MenuItemDefinition( "AspNetZero", new 
FixedLocalizableString("ASP.NET Zero") ).AddItem( new MenuItemDefinition( "
AspNetZeroHome", new FixedLocalizableString("Home"), url: "
https://aspnetzero.com?ref=abptmpl" ) ).AddItem( new MenuItemDefinition( "
AspNetZeroDocuments", new FixedLocalizableString("Documents"), url: "
https://aspnetzero.com/Documents?ref=abptmpl" ) ) ) ); } private static 
ILocalizableString L(string name) { return new LocalizableString(name, 
TPLMSConsts.LocalizationSourceName); } } } 
 
二、abp菜单类
      ABP框架中已经为我们做了前期的准备工作。在ABP中有一个MenuDefinition类,这个类封装了导航栏上的主菜单的属性。
     MenuDefinition
:主菜单类,定义了一个List<MenuItemDefinition>,这个类存放了我们定义的菜单,同时定义了AddItem方法
 
 
using System.Collections.Generic; using Abp.Localization; namespace 
Abp.Application.Navigation {// Represents a navigation menu for an application. 
public class MenuDefinition : IHasMenuItemDefinitions { // // 构造函数 // public 
MenuDefinition(string name, ILocalizableString displayName, object customData = 
null); // //菜单名称 // public string Name { get; } // //表示本地化字符串 // public 
ILocalizableString DisplayName {get; set; } // //自定义数据 // public object 
CustomData {get; set; } // 菜单集合 public List<MenuItemDefinition> Items { get; set
; }// 添加菜单 // public MenuDefinition AddItem(MenuItemDefinition menuItem); // // 
删除菜单// public void RemoveItem(string name); } } 
 
      
在ABP中还有一个MenuItemDefinition类,这个类中封装了子菜单的属性,子菜单可以添加其他子菜单构成一个菜单树。我们首先来了解一下MenuItemDefinition类的属性与方法。MenuItemDefinition成员定义如下:   
     
public class MenuItemDefinition : IHasMenuItemDefinitions { // // 构造函数: public 
MenuItemDefinition(string name, ILocalizableString displayName, string icon = 
null, string url = null, 
bool requiresAuthentication = false, string requiredPermissionName = null, int 
order =0, object customData = null, 
IFeatureDependency featureDependency = null, string target = null, bool 
isEnabled =true, bool isVisible = true,
 IPermissionDependency permissionDependency = null); // // 摘要: // Can be used 
to enable/disable a menu item. public bool IsEnabled { get; set; } // 自定义数据 
public object CustomData { get; set; } // // 摘要: // Target of the menu item. 
Can be "_blank", "_self", "_parent", "_top" or a frame// name. public string 
Target {get; set; } // 是否有子菜单 public bool IsLeaf { get; } // 
权限验证如果通过验证显示此菜单否则不可见//即只有登陆后才会显示该菜单 public bool RequiresAuthentication { get; 
set; } // 功能特性 public IFeatureDependency FeatureDependency { get; set; } // // 
摘要:// A permission dependency. Only users that can satisfy this permission 
dependency// can see this menu item. Optional. public IPermissionDependency 
PermissionDependency {get; set; } //即用户具有指定的权限时才显示菜单 // 权限名称 [Obsolete("Use 
PermissionDependency instead.")] public string RequiredPermissionName { get; set
; }// The URL to navigate when this menu item is selected. public string Url { 
get; set; } // 菜单图标 public string Icon { get; set; } // 排序 public int Order { 
get; set; } // 表示本地化字符串 public ILocalizableString DisplayName { get; set; } // 
菜单名称 public string Name { get; } // 是否显示菜单 public bool IsVisible { get; set; } 
// 子菜单 public virtual List<MenuItemDefinition> Items { get; } // 添加子菜单 public 
MenuItemDefinition AddItem(MenuItemDefinition menuItem);// 删除菜单: public void 
RemoveItem(string name); } } 
      从上面的代码中,我们可以看到做为一个菜单树的相关属性与相关方法,ABP都已经为我们准备好了。有了以上对象我们可以方便自定义任何菜单。
热门工具 换一换