ABP之展现层(导航菜单)

 基本的增删改查已经粗糙的结束了,接下来就是要方便的展示了,也就是导航菜单。在Abp中已经对导航栏的设置进行了相应的封装(Abp.Application.Navigation),可以方便我们快速的将自己开发的页面添加到首页的导航栏中。

一.添加自己的导航菜单

当我们从ABP官网下载模板的时候,项目会自动的为我们在MVC项目中的StartUp文件夹中创建一个...NavigationProvider的文件,同时会添加基本的菜单:主页、用户、租户、关于。

 

不但已经默认给我们创建了一个provider,而且已经给我们初始化了

 

看懂了模板中的菜单的定义方式和注意事项,接下就可以自定义我们的菜单

                                      

刷新一下页面,我们自定义的页面就这么轻易的创建了

                                  

二.导航菜单的具体创建流程

1. 几个重要的类

NavigationManager菜单的和心类,这个类定义了MenuDefinition(主菜单)、NavigationConfiguration(导航菜单配置),同时调用NavigationProvider中的SetNavigation,完成菜单的初始化。

MenuDefinition:主菜单类,定义了一个List<MenuItemDefinition>,这个类存放了我们定义的菜单,同时定义了AddItem方法

从上面的源码中可以看出我们最开始自定义的导航菜单的方法就是在这里定义的。

MenuItemDefinition:子菜单,这就是我们具体的展示在页面上的菜单。它也定了一个List<MenuItemDefinition>和AddItem方法

从这边的代码中可以看出,因为子菜单中定义了List<MenuItemDefinition>,所以我们的菜单支持菜单的不断的嵌套。

NavigationConfiguration:用来存放菜单的,我们上面的MenuItemDefinition定义的全部是每个菜单项的具体信息,那么整个菜单(provider)存放在哪呢,没错,就是这。比如最上面的我们自定义的导航类StudyABPProjectNavigationProvider : NavigationProvider

 

NavigationProvider:这个就是用来存放菜单的自定义类需要继承的抽象类

 

现在总结一下:其实通过上面的几个类就可以看出我们定义的菜单的实现流程了。

 首先我们创建自定义XXXProvider类继承自NavigationProvider,并在Provider中定义好MenuItemDefinition。然后将provider添加到NavigationConfiguration中。最后通过NavigationManager调用Initialize方法,在这个方法里调用每个provider的SetNavigation方法,完成菜单的定义。

等一下,现在有一个问题,在最开始我们依葫芦画瓢定义自己的菜单的时候,需要为菜单定义权限,就是说拥有权限的用户登陆才可以看到相应的菜单栏,我们的ABP系统是一个完善的具有权限管理的系统,我们上面的分析,通过NavigationManager初始化菜单,并没有与权限有什么卵的关系。那么我们每个人登陆时获取的菜单都是一样的,这不就出问题了嘛。。。。。。。。。。。。。所以还有一个重要的类需要看一下,那就是UserNavigationManager

 

这就比较清楚了,哈哈哈

最后一个问题,如果我们想要获取到我们定义的菜单,应该怎么做?

(1)通过NavigaitonManager(ISingleDependency单例模式)获取所有菜单,所以我们可以直接通过注入的方式获取到

(2)通过UserNavigatinManager(ITranseientDependency临时注入模式)获取指定用户的菜单,可以通过依赖注入,也可以直接new出来

 

 

posted @ 2018-03-09 16:06  善良的小赵  阅读(1737)  评论(2编辑  收藏  举报