铁路建设监理协会官方网站,北京制作网站公司排名,搜索引擎优化结果,自己做网站成本ABP入门系列目录——学习Abp框架之实操演练源码路径#xff1a;Github-LearningMpaAbp 完成了增删改查以及页面展示#xff0c;这一节我们来为任务清单添加【导航菜单】。 在以往的项目中#xff0c;大家可能会手动在layout页面中添加一个a标签来新增导航菜单#xff0c;这… ABP入门系列目录——学习Abp框架之实操演练源码路径Github-LearningMpaAbp 完成了增删改查以及页面展示这一节我们来为任务清单添加【导航菜单】。 在以往的项目中大家可能会手动在layout页面中添加一个a标签来新增导航菜单这也是一种方式但是如果要针对不同用户不同权限决定是否显示某个菜单那么直接在layout页面中去控制就不方便了。 不过ABP已经为大家考虑了这一点集成了通用的创建和显示菜单的方式。其主要代码集成在Abp.Application.Navigation命名空间下相应源码在此。 下面我们就来梳理下导航菜单是如何实现和使用。
一、如何使用Abp集成的导航菜单
针对我们的『任务清单』Deom我们需要在导航栏上添加一个【Task List】的菜单入口。
1.打开web展现层定位到App_Start/xxxNavigationProvider.cs。 public class LearningMpaAbpNavigationProvider : NavigationProvider{public override void SetNavigation(INavigationProviderContext context){context.Manager.MainMenu.AddItem(new MenuItemDefinition(Home,L(HomePage),url: ,icon: fa fa-home,requiresAuthentication: true)).AddItem(new MenuItemDefinition(Tenants,L(Tenants),url: Tenants,icon: fa fa-globe,requiredPermissionName: PermissionNames.Pages_Tenants)).AddItem(new MenuItemDefinition(Users,L(Users),url: Users,icon: fa fa-users,requiredPermissionName: PermissionNames.Pages_Users)).AddItem(new MenuItemDefinition(About,L(About),url: About,icon: fa fa-info));}
}该文件中默认定义了Home、Tenants、Users、About四个菜单。注意观察的话想必会注意到Home菜单设置了requiresAuthentication: true即只有登陆后才会显示该菜单。Tenants和Users菜单设置了requiredPermissionName属性即用户具有指定的权限时才显示菜单。About菜单没有限制默认显示。 每一个菜单项都是一个MenuItemDefinition其中主要包括Name唯一名称DisplayName本地化显示名称Url菜单跳转Icon指定菜单图标。 解释到这里大家自己都可以依葫芦画瓢新增菜单了。
2.添加[Task List]菜单项
AddItem(new MenuItemDefinition(TaskList,L(Task List),url: Tasks/Index,icon: fa fa-tasks,requiresAuthentication: true)保存刷新页面即可看到新增的[Task List]菜单了。 PS:之所以页面上会显示为[Task List]是因为我们并没有维护本地化资源文件。在对应的本地化配置文件中新增名为Task List的即可。比如在中文的本地化文件中添加text nameTask List value任务清单 /重新启站点将语言切换为中文。 二、Abp集成的导航菜单的代码结构
1.先来看看相关代码的类型依赖关系图 类型依赖关系图 分析发现abp集成的导航菜单实际上是应用了组合设计模式。 其中MenuDefinition为根节点MenuItemDefinition为树枝节点其中MenuItemDefinition中也维护了一个ListMenuItemDefinition的集合当集合为空时MenuItemDefinition即为树叶节点。
2.从图中可以看出主要是由以下几部分组成
MenuDefinition/MenuItemDefinition菜单/菜单项定义。其中菜单项包括Name唯一名称DisplayName本地化显示名称Url菜单跳转Icon指定菜单图标。此外可以通过指定RequiresAuthenticationtrue来限制菜单项只有对登录用户可见同时也可以指定RequiredPermissionName来限定当用户有某个权限时菜单才可见。UserMenu/UserMenuItem封装了用于显示给用户的菜单/子菜单集合。INavigationConfiguration/NavigationConfiguration导航配置维护了NavigationProvider的列表。NavigationProviderProvider模式将api的定义和实现分离。抽象类定义了SetNavigation方法在需要设置导航的项目中实现该类并在对应的模块中PreInitialize方法中注册***NavigationProvider的实现。INavigationManager/NavigationManager其中接口中定义了一个Dictionary用来存储应用程序中定义的所有菜单项和一个MainMenu。注入了对INavigationConfiguration的引用以便在NavigationManager中的Initialize方法遍历INavigationConfiguration配置的NavigationProvider列表进行菜单的初始化。IUserNavigationManager/UserNavigationManager是对NavigationManager的一次封装。其中接口中定义了GetMenuAsync的重载方法用来获取指定用户的菜单。INavigationProviderContext/NavigationProviderContext封装了INavigationManager的上下文类用于传参。三、Abp集成的导航菜单的具体实现
核心逻辑NavigationManager遍历NavigationConfiguration中维护的NavigationProvider列表并调用NavigationProvider实现的SetNavigation方法来完成导航菜单的初始化。
NavigationManager负责初始化菜单 NavigationManager.cs
NavigationConfiguration负责维护NavigationProvider的实现列表。 NavigationConfiguration.cs
具体的NavigationProvider的实现 xxxxNavigationProvider.cs
在对应的模块中注册具体的NavigtionProvider到INavigationConfiguration维护的列表中。 xxxxAbpWebModule.cs
UserNavigationManager对NavigationManager进行了进一步的封装根据用户和权限去创建和获取菜单。 IUserNavigationManager.cs
在LayoutController中通过注入对IUserNavigationManager的引用来获取菜单并由_TopMenu分部页进行最终呈现。
public class LayoutController : LearningMpaAbpControllerBase{private readonly IUserNavigationManager _userNavigationManager;private readonly ISessionAppService _sessionAppService;private readonly IMultiTenancyConfig _multiTenancyConfig;private readonly ILanguageManager _languageManager;public LayoutController(IUserNavigationManager userNavigationManager, ISessionAppService sessionAppService, IMultiTenancyConfig multiTenancyConfig,ILanguageManager languageManager){_userNavigationManager userNavigationManager;_sessionAppService sessionAppService;_multiTenancyConfig multiTenancyConfig;_languageManager languageManager;}[ChildActionOnly]public PartialViewResult TopMenu(string activeMenu ){var model new TopMenuViewModel{MainMenu AsyncHelper.RunSync(() _userNavigationManager.GetMenuAsync(MainMenu, AbpSession.ToUserIdentifier())),ActiveMenuItemName activeMenu};return PartialView(_TopMenu, model);}
}至此我们完成了对导航菜单的梳理和总结。 11人点赞 Abp架构入门系列 作者圣杰 链接https://www.jianshu.com/p/24e6f6e8dbdb 来源简书 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。