abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六)
abp(net core)+easyui+efcore实现仓储管理系统目录
abp(net core)+easyui+efcore实现仓储管理系统——abp总体介绍(一)
abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)
abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)
abp(net core)+easyui+efcore实现仓储管理系统——定义仓储并实现 (四)
abp(net core)+easyui+efcore实现仓储管理系统——创建应用服务(五)
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之控制器(六)
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七)
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八)
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九)
abp(net core)+easyui+efcore实现仓储管理系统——多语言(十)
abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十一)
abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十二)
abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十三)
abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十四)
abp(net core)+easyui+efcore实现仓储管理系统——使用 webapi实现curd (十五)
在前面的文章()中我们学会了如何添加静态菜单,但是做为一个信息管理系统,总不能每次有新功能新菜单,都静态添加菜单,编译,再上线。我们希望的是有一个菜单管理界面,在此页面中输入相应的菜单,只要我们重新登录,菜单就自动显示在菜单栏中。而菜单的来源可以是多样的,可以从需要从数据库,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都已经为我们准备好了。有了以上对象我们可以方便自定义任何菜单。
推荐阅读
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理三 (二十一)
-
abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)
-
abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之五(三十一)
-
abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之八(三十四)
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理五 (二十三)
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理八(二十六)
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七)
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八)
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九)