每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户。本文主要说明菜单的创建,以及结合AngularJS上菜单的显示,如何从数据库动态取得菜单数据不再本文范围。

创建菜单

一个应用程序可能有多个不同的模块,每个模块有它对应的菜单项。为了定义这些菜单项,我们需要创建一个继承自 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 用于取得应用程序的主菜单。

DDD开发框架ABP之导航菜单的更多相关文章

  1. DDD开发框架ABP之本地化/多语言支持

    本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...

  2. DDD开发框架ABP之本地化资源的数据库存储扩展

    在上一篇<DDD开发框架ABP之本地化/多语言支持>中,我们知道,ABP开发框架中本地化资源存储可以采用XML文件,RESX资源文件,也提供了其他自定义的存储方式的扩展接口.ABP框架默认 ...

  3. ABP Zero 导航菜单之角色权限

    本文的项目是官网生成,项目名称为XX,WEB为MVC,以Users权限模块为例解说文章. 1.定义PermissionNames PermissionNames是一个静态类,它在/XX.Core/Au ...

  4. DDD开发框架ABP之动态Web API层

    建立动态Web API 控制器 ASP.NET Boilerplate 能够自动为您的应用层产生Web API层.比如说我们有如下的一个应用服务: public interface ITaskAppS ...

  5. 基于DDD的现代ASP.NET开发框架--ABP系列之3、ABP分层架构

    基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:ht ...

  6. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

    基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  7. DDD的ABP开发框架

    基于DDD的ABP开发框架初探   一.基本概念 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP是土耳其的以为架构师hikalkan开发 ...

  8. ABP入门系列(6)——定义导航菜单

    ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...

  9. 线上分享-- 基于DDD的.NET开发框架-ABP介绍

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

随机推荐

  1. Show Linux Package Sort By Size

    ArchLinux: ~ $ pacsysclean Debian: ~ $ sudo apt-get install debian-goodies ~ $ dpigs -H

  2. tengine-2.1.0 + GraphicsMagick-1.3.20

    export LUAJIT_LIB=/usr/local/libexport LUAJIT_INC=/usr/local/include/luajit-2.0/./configure --prefix ...

  3. 开发一款高端大气上档次的android应用需要必备的知识——记于2013年末

    Android入门还是很简单的,看两本书,翻阅几篇文章,搭建了开发环境就算入门了.可是怎样开发一款完备的android应用呢,开发一款高端的android应用又需要那些知识呢,作者根据几年的开发经验做 ...

  4. [SLAM] Studying Guidance

    Books from Zhihu: 幽默一把 看完Gonzalez:嗯,好像很好玩的样子,我也来搞一搞.看完Price:什么鬼,怎么这么多公式,公式看不懂肿么破.看完Szeliski:原来用一千页的书 ...

  5. Oracle 11g 安全加固

    1.安全加固的检查方向 2.安全加固检查safeCheck.sh 3.安全加固执行safeExec.sh 1.安全加固的检查方向 1.1.sysdba用户远程登录限制(查看Oracle登录认证方式) ...

  6. C++ async task

    最近在搞Android 开发,里面多线程的使用比较频繁,java多线程接口很方便. Thread, AysncTask, Handler 这些接口比起posix提供的pthread_create()等 ...

  7. 使用即时文件初始化提高SQL Server性能

    今天我想谈下SQL Server里的一个特别话题——即时文件初始化(Instant File Initialization).对于你的SQL Server实例,如果你启用了即时文件初始化,在特定情况下 ...

  8. 初涉SQL Server性能问题(3/4):列出阻塞的会话

    在 初涉SQL Server性能问题(2/4)里,我们讨论了列出等待资源或正运行的会话脚本.这篇文章我们会看看如何列出包含具体信息的话阻塞会话清单. /************************ ...

  9. 由node-webkit想到

    本人做为.NET的死忠也有些许年头.微软这几年被谷歌苹果之流打的有点招架不住..NET的前景也难免堪忧.虽然我认为就强类型语言方面,C#绝对是最强者.但是新技术的发展确实是可怕的,看看苹果几年就把no ...

  10. DataBase --- Intellij IDEA 14.1.4使用Java连接SQL Server教程

    Java连接数据库的方法大体分为两种:正向连接和反向连接.反向连接需要编译器提供相关的插件来支持,目前主流的java IDE都支持反向连接.这里主要对正向连接做一个经验总结. 一.数据库的配置 1.新 ...