基本的增删改查已经粗糙的结束了,接下来就是要方便的展示了,也就是导航菜单。在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出来

ABP之展现层(导航菜单)的更多相关文章

  1. ABP(现代ASP.NET样板开发框架)系列之22、ABP展现层——导航栏设置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之22.ABP展现层——导航栏设置 ABP是“ASP.NET Boilerplate Project (ASP.NE ...

  2. ABP之展现层(Datatables分页)

    在前面的随笔中,已经介绍了ABP的增删改查的操作,但是对于查询的数据并没有进行分页,只是进行粗糙的展示,今天的随笔中将摸索进行分页展示.这里打算使用的分页插件是DataTables,这是一款比较强大的 ...

  3. abp的权限与导航菜单的关系

    原来以为各是各的,所以就有了第一个版本.Getallmentus.然后注入了role,当然失败了.获取所有的菜单.一直在思考在什么地方设置菜单是否展示呢? 后面看了源码.才发现自己错了. UserNa ...

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

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

  5. DDD开发框架ABP之导航菜单

    每一个网站都会有导航菜单(通常不止一个),ASP.NET Boilerplate(后文简称ABP)提供了一种创建和使用菜单的通用架构,利用架构我们可以方便的创建菜单并显示给用户.本文主要说明菜单的创建 ...

  6. ABP(现代ASP.NET样板开发框架)系列之20、ABP展现层——动态生成WebApi

    点这里进入ABP系列文章总目录 ABP(现代ASP.NET样板开发框架)系列之20.ABP展现层——动态生成WebApi ABP是“ASP.NET Boilerplate Project (ASP.N ...

  7. ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project ...

  8. ABP(现代ASP.NET样板开发框架)系列之23、ABP展现层——异常处理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之23.ABP展现层——异常处理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  9. ABP入门系列(6)——展现层实现增删改查

    这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终实现效果如下图: 一.定义Controller ABP对ASP.NET MVC Controllers ...

随机推荐

  1. Spring Cloud Netflix Eureka源码导读与原理分析

    Spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究. 本文主要分为四部分,一是对项目构建 ...

  2. C#代码安装Windows服务

    using System;using System.Collections.Generic;using System.ServiceProcess;using System.Configuration ...

  3. 【ZH奶酪】为什么Python不需要函数重载?

    函数重载的作用是什么? 函数重载主要是为了解决两个问题 可变参数类型 可变参数个数 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如 ...

  4. 《Unix&Linux大学教程》学习笔记5 :正则表达式

    1:Unix下正则表达式规则

  5. Uploadify导致Chrome频繁崩溃Crash

    上传功能是工作中经常会遇到的问题,应该作为开发标配的技能每个人都会. 我选用的是Uploadify 3.1.2进行上传,使用方法参考之前的一篇文章, 今天记录下一个我遇到的很神奇的bug chrome ...

  6. 正则匹配报文中的XML(HTML)标签,替换重新输出

    调用返回报文标签中的存在中划线“-”,不符合规范,需要统一进行转换,但不能替换标签内的内容,利用正则匹配重新输出 /** * 正则匹配报文中的xml标签,将其中的"-"转换为&qu ...

  7. redhat7.0配置网卡

    1.切换到网卡配置目录: cd /etc/sysconfig/network-scripts 2.编辑网卡信息 如 vim ifcfg-enpos3 TYPE=Ethernet #设备类型 BOOTP ...

  8. MUI class="mui-switch"开关 JQuery 控制开关

    <div class="mui-switch mui-active"> <div class="mui-switch-handle">& ...

  9. [svc]rsync简单部署

    安装rsync服务端-backup服务器 yum install rsync -y useradd rsync -s /sbin/nologin -M chown -R rsync.rsync /da ...

  10. 【iCore4 双核心板_ARM】例程二十:LWIP_TCP_CLIENT实验——以太网数据传输

    实验现象: 核心代码: int main(void) { system_clock.initialize(); //ϵͳʱÖÓ³õʼ»¯ led.initialize(); //LED³õʼ ...