先来看个最终效果图

以前我们配置后台菜单 一般都是把菜单链接, 图标, 以及层级关系 配置到数据库,Core很容易通过json文件来配置导航菜单  而不用存数据库了

先添加个menuconfig.json 文件,来看下json文件的结构

其中Url 就是链接地址,Icon就是要显示的图标   通过childs 这样层级关系就有了

在Startup.cs 里添加这个json配置文件

 public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile("menuconfig.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables(); Configuration = builder.Build();
}

注意   AddJsonFile  这个 第二个参数 optional: (Whether the file is optional)是否可选,意思是如果配置文件不存在的时候是否要抛异常。

第三个参数 reloadOnChange  json文件更改后是否重新加载。

然后在 ConfigureServices 里做注册

   services.Configure<MenuCollectionConfig>(Configuration.GetSection("MenuCollectionConfig"));
public class MenuCollectionConfig
{
public MenuItem[] MenuItems { get; set; }
} public class MenuItem
{
public string Name { get; set; } public string Resource { get; set; } public string Url { get; set; } public string SubNavUrl { get; set; } public string Icon { get; set; }
public MenuItem[] Childs { get; set; }
}

这样在Controller的 构造函数中注入

 private readonly IOptions<MenuCollectionConfig> _menus;

        public HomeController(
IOptions<MenuCollectionConfig> menus)
{
_menus = menus;
} public IActionResult Index()
{
List<MenuItem> menus = new List<MenuItem>();
foreach(var item in _menus.Value.MenuItems)
{
List<MenuItem> secondChilds = CheckChilds(item.Childs);
if (secondChilds.Count > )
{
MenuItem newItem = new MenuItem();
newItem.Name = item.Name;
newItem.Icon = item.Icon;
newItem.Resource = item.Resource;
newItem.SubNavUrl = item.SubNavUrl;
newItem.Url = item.Url;
newItem.Childs = secondChilds.ToArray();
menus.Add(newItem);
}
} MenuCollectionConfig config = new MenuCollectionConfig();
config.MenuItems = menus.ToArray();
ViewBag.Menus = JsonConvert.SerializeObject(config);
return View();
} private List<MenuItem> CheckChilds(IEnumerable<MenuItem> childs)
{
List<MenuItem> result = new List<MenuItem>(); foreach (var item in childs)
{
if (item.Childs != null)
{
List<MenuItem> thirdLevelMenu = CheckChilds(item.Childs);
if (thirdLevelMenu.Count > )
{
MenuItem newItem = new MenuItem();
newItem.Name = item.Name;
newItem.Icon = item.Icon;
newItem.Resource = item.Resource;
newItem.SubNavUrl = item.SubNavUrl;
newItem.Url = item.Url;
newItem.Childs = thirdLevelMenu.ToArray();
result.Add(newItem);
}
}
else
{
result.Add(item);
}
}
return result;
}
注意 CheckChilds 方法里有个递归  这样无限层级的也能实现 当然后台最多3级也差不多了

博客经个人辛苦努力所得,如有转载会特别申明,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律

原文地址: https://www.cnblogs.com/alonglonga/p/11876300.html    小赫赫首发

有问题联系Q: 591811930

.Net Core通过json文件 配置管理后台导航菜单的更多相关文章

  1. ASP.NET Core appsettings.json 文件

    ASP.NET Core appsettings.json 文件 在本节中,我们将讨论 ASP.NET Core 项目中appsettings.json文件的重要性. 在以前的 ASP.NET 版本中 ...

  2. ASP.NET Core launchsettings.json 文件

    ASP.NET Core launchsettings.json 文件 在本节中,我们将讨论在 ASP.NET Core 项目中launchsettings.json文件的重要性. launchset ...

  3. ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...

  4. 转载:ASP.NET Core 在 JSON 文件中配置依赖注入

    在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.Stri ...

  5. 使用.net core读取Json文件配置

    1.使用vs2017创建一个应用台程序 2.使用程序包管理器控制台执行命令 Install-Package Microsoft.AspNetCore -Version 2.0.1 3.创建一个json ...

  6. .net core 读取json文件

    核心代码 Program.cs: using System; using System.IO; using Microsoft.Extensions.Configuration; namespace ...

  7. opencart 后台导航菜单添加步骤

    1,找到在catalog\language\english\common\header.php // Text$_['text_affiliate'] = 'Affiliates';$_['text_ ...

  8. WordPress主题开发:开启导航菜单功能

    步骤一:开启导航菜单功能 <?php /* register_nav_menu( $location, $description ) 函数功能:开启导航菜单功能 @参数 string $loca ...

  9. .net core - 配置管理 - json文件配置

    Json 文件配置 public class Startup { public Startup(IHostingEnvironment env) { var builder = new Configu ...

随机推荐

  1. Spring注解开发系列VIII --- SpringMVC

    SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...

  2. mac系统安装、启动与关闭redis

    一.下载 打开官网:https://redis.io/ Download---Stable---Download5.0.4,下载最新稳定版,看具体情况而定我这里是5.0.4版本. 二.安装 下载完成后 ...

  3. vue报错Error in v-on handler: "RangeError: Maximum call stack size exceeded"

    看下面的报错 错误 看到这个错误一脸懵逼.后面了解到,是因为程序进入了死循环,后面检查了我的代码,原来在这里自己调用自己

  4. Linux 下tomcat 的重新启动

    在 Linux 系统下,重启 Tomcat 如何使用命令操作? 1.首先,进入 Tomcat 的 bin 目录 cd /usr/local/tomcat/bin 2.使用Tomcat关闭命令 ./sh ...

  5. ROS中的3D建模机器人(三)

    一.利用xacro理解机器人建模 当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的.可重用性,模块化和可编程性. URDF是一个单独的文件我们不能在它里面包含其他 ...

  6. 1、OSI参考模型

    网络的层次模型:Core layer (核心层):高速转发,不建议做策略  Distribution layer (分布层,汇聚层):基于策略连接(路由控制,安全策略)Access layer (接入 ...

  7. js - 构造函数-静态属性/方法-原型对象 - 前端第八课

    先来个普通对象 var duixiang={ a:"111", b:function (s) { return s+"886"; } }; console.lo ...

  8. (五)myBatis架构以及SQlSessionFactory,SqlSession,通过代理执行crud源码分析---待更

    MyBatis架构 首先MyBatis大致上可以分为四层: 1.接口层:这个比较容易理解,就是指MyBatis暴露给我们的各种方法,配置,可以理解为你import进来的各种类.,告诉用户你可以干什么 ...

  9. JAVA 对守护线程的理解

    1.在start之前,setDaemon. 该现场就成为守护线程了. 2.守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. 示例代 ...

  10. shell 颜色输出

    #!/bin/bash function display_method(){ clearDisplayMetho=0 if [ $displayMethod -eq 0 ]; then echo -e ...