先来看个最终效果图

以前我们配置后台菜单 一般都是把菜单链接, 图标, 以及层级关系 配置到数据库,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. Maven debug异常:Source not found.

    异常 用Maven debug 时出现了Source not found.,在调试过程中尝试添加源码也没有效果 解决方案 先把当前正在运行中的项目停止 右键项目 -> Debug As -> ...

  2. HTML简介介绍

    网页概述 网页:纯文本格式的文件:(以村文本格式编写,后缀名改为HTML的文本文件) ---- 网站:多个网页的集合: ---- 主页:打开网站后显示的第一个页面: ---- 浏览器:将纯文本格式的文 ...

  3. C++基类和派生类的构造函数

    派生类不能继承基类的构造函数,若想通过派生类来对基类的private的变量成员进行初始化则需要: 通过派生类的构造函数来调用基类的构造函数完成基类成员变量的初始化. 看下面的例子: #include ...

  4. 用goaccess实现可视化并实时监控access日志

    goaccess access.log -o ../html/report.html --real-time-html time-format='%H:%M:%S' --date-format=‘%d ...

  5. VC运行时库/MD、/MDd、/MT、/MTd说明

    http://blog.csdn.net/holybin/article/details/26134153 VC运行时库设置:VC项目属性->配置属性->C/C++->代码生成-&g ...

  6. Win32实现迷宫

    跟着杨立祥老师的课程,为了完成扫雷的作业,打算先用DFS/BFS实现路径搜索的简单Demo. 生成迷宫: /* 扫雷程序生成方砖 */ #include <stdio.h> #includ ...

  7. linux下手动安装/升级GCC到较高版本

    一.环境 VMWare+Centos7 二.写在前面的话 安装GCC最简单的方式当然是[yum -y install gcc]但是我的机器上安装下来后,其版本是4.8.5,感觉有点低,所以想升级一下( ...

  8. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  9. css中flex布局

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ display: flex; ...

  10. 动手学习Pytorch(7)--LeNet

    Convolutional Neural Networks 使用全连接层的局限性: 图像在同一列邻近的像素在这个向量中可能相距较远.它们构成的模式可能难以被模型识别. 对于大尺寸的输入图像,使用全连接 ...