DDD开发框架ABP之导航菜单
2015-09-28 09:34
441 查看
每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户。本文主要说明菜单的创建,以及结合AngularJS上菜单的显示,如何从数据库动态取得菜单数据不再本文范围。
假设我们有一个如下所示的主菜单:
这里面系统管理菜单有两个子菜单项。建立一个这样菜单的类ZeroNavigationProvider,如下:
一个MenuItemDefinition对象可能拥有一个唯一的命名,一个本地化显示的名称,一个URL地址以及一个图标。一个菜单项也可能需要拥有特定权限的用户才可以浏览。
本地化显示的名称来自于资源文件,LocalizableString第二个参数就是系统中资源文件的名称。这时候需要确保资源文件存在,比如:Zero-zh-CN.xml,而且根据第一个代码参数必须能够正常取出对应的文本内容,否则菜单可能无法显示。
INavigationProviderContext 提供了一些方法接口,用于得到已经存在的菜单项,添加菜单以及子菜单。因此不同的模块能够添加自己的菜单项。
一个应用程序可能有多个菜单,context.Manager.MainMenu 只是对应默认的主菜单。我们可以利用 context.Manager.Menus 属性自己创建并添加更多的菜单。
创建了 NavigationProvider 之后,我们需要将它注册到ABP的配置项中,这个动作应该放在我们模块的 PreInitialize 事件中。比如我们网站的Web层有一个 ZeroWebModule,在其中添加代码:
我们也可以在客户端创建菜单。ABP自动产生Javascript API ,使得我们在客户端可以轻松取得菜单和菜单项。做到这一点,我们只需要在网页引入下面的一行代码(动态生成的Javascript):
在调试状态下,我们可以查看动态生成的Javascript代码,其中有一段关于导航菜单的定义:
在Javascript 里面我们就可以使用 abp.nav 命名空间下的方法和属性,比如:abp.nav.menus.MainMenu 用于取得应用程序的主菜单。
创建菜单
一个应用程序可能有多个不同的模块,每个模块有它对应的菜单项。为了定义这些菜单项,我们需要创建一个继承自 NavigationProvider 的子类。假设我们有一个如下所示的主菜单:
工作台 任务 留言板 系统管理 用户管理 角色管理
这里面系统管理菜单有两个子菜单项。建立一个这样菜单的类ZeroNavigationProvider,如下:
public class ZeroNavigationProvider : NavigationProvider { public override void SetNavigation(INavigationProviderContext context) { context.Manager.MainMenu .AddItem( new MenuItemDefinition( "Dashboard", new LocalizableString("HomePage", "Zero"), url: "#/", icon: "icon-home" ) ).AddItem( new MenuItemDefinition( "Task", new LocalizableString("Task", "Zero"), url: "#/tasklist", icon: "icon-tag" ) ).AddItem( new MenuItemDefinition( "QA", new LocalizableString("QA", "Zero"), url: "#/qa", icon: "icon-question" ) ).AddItem( new MenuItemDefinition( "SystemAdmin", new LocalizableString("SystemAdmin", "Zero"), icon: "icon-wrench" ).AddItem( new MenuItemDefinition( "UserManage", new LocalizableString("UserManage", "Zero"), url: "/systemadmin/users", icon: "icon-users" ) ).AddItem( new MenuItemDefinition( "RoleManage", new LocalizableString("RoleManage", "Zero"), url: "/systemadmin/role", icon: "icon-briefcase" ) ); } }
一个MenuItemDefinition对象可能拥有一个唯一的命名,一个本地化显示的名称,一个URL地址以及一个图标。一个菜单项也可能需要拥有特定权限的用户才可以浏览。
new MenuItemDefinition( "RoleManage", new LocalizableString("RoleManage", "Zero"), url: "/systemadmin/role", icon: "icon-briefcase", requiredPermissionName: "systemadmin", requiresAuthentication:true )
本地化显示的名称来自于资源文件,LocalizableString第二个参数就是系统中资源文件的名称。这时候需要确保资源文件存在,比如:Zero-zh-CN.xml,而且根据第一个代码参数必须能够正常取出对应的文本内容,否则菜单可能无法显示。
INavigationProviderContext 提供了一些方法接口,用于得到已经存在的菜单项,添加菜单以及子菜单。因此不同的模块能够添加自己的菜单项。
一个应用程序可能有多个菜单,context.Manager.MainMenu 只是对应默认的主菜单。我们可以利用 context.Manager.Menus 属性自己创建并添加更多的菜单。
创建了 NavigationProvider 之后,我们需要将它注册到ABP的配置项中,这个动作应该放在我们模块的 PreInitialize 事件中。比如我们网站的Web层有一个 ZeroWebModule,在其中添加代码:
public override void PreInitialize() { // other configuration code, like localization // Configure navigation/menu Configuration.Navigation.Providers.Add<ZeroNavigationProvider>(); }
显示菜单
我们能够在服务器端创建菜单。Abp.Application.Navigation 命名空间下的 IUserNavigationManager 接口通过依赖注入,实现菜单项的取得和显示。服务器端创建菜单通常用于ASP.NET MVC 的多页面网站,这里略过不表。我们也可以在客户端创建菜单。ABP自动产生Javascript API ,使得我们在客户端可以轻松取得菜单和菜单项。做到这一点,我们只需要在网页引入下面的一行代码(动态生成的Javascript):
<script src="~/AbpScripts/GetScripts" type="text/javascript"></script>
在调试状态下,我们可以查看动态生成的Javascript代码,其中有一段关于导航菜单的定义:
(function() { abp.nav = {}; abp.nav.menus = { 'MainMenu': { name: 'MainMenu', displayName: 'Main menu', items: [{ name: 'Dashboard', icon: 'icon-home', url: '#/', displayName: '工作台', items: [] } , { name: 'Task', icon: 'icon-tag', url: '#/task', displayName: '任务', items: [] } , { name: 'QA', icon: 'icon-question', url: '#/qa', displayName: '留言板', items: [] } , { name: 'SystemAdmin', icon: 'icon-wrench', displayName: '系统管理', items: [{ name: 'UserManage', icon: 'icon-users', url: '/systemadmin/users', displayName: '用户管理', items: [] } , { name: 'RoleManage', icon: 'icon-briefcase', url: '/systemadmin/rolelist', displayName: '角色管理', items: [] }] }; } })();
在Javascript 里面我们就可以使用 abp.nav 命名空间下的方法和属性,比如:abp.nav.menus.MainMenu 用于取得应用程序的主菜单。
相关文章推荐
- CSS-3 Transition 的使用
- Frosh Week
- 搜索引擎排名不友好的五个地点-SEO
- 【Java EE 学习 49 上】【Spring学习第一天】【基本配置】
- OpenGL3.0教程 第三课: 矩阵
- Light oj 1205 - Palindromic Numbers(数位dp)
- Redis 宕机之后 启动失败 启动不了 原因之一 aof 文件出错 以及持久化介绍
- 记View跨界平局
- 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..
- OpenGL3.0教程 第二课: 画第一个三角形
- Save as PDF/X-3/4/5 error with pdflib
- 【Android】上周问题记录
- 各种AJAX方法的使用比较详解
- oracle各种报错信息
- 数学之美番外篇:平凡而又神奇的贝叶斯方法
- jQuery源码分析之proxy函数
- 寻找中位数(分治法)
- linux启动过程图解
- OpenGL3.0教程 第一课:新建一个窗口
- Mac OS X 下的JDK路径