一、前言

  使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在json配置文件中,再读取出来经过处理后生成目录树。

二、数据结构

  1. TreeMenuNode类名

  将TreeMenuNode类设置成与json格式相对应,注意Children应为List类型。目录的内容包括MenuName,Action,Controller,Icon

    public class TreeMenuNode2
{
public int MenuNumber { get; set; }
public string MenuName { get; set; }
public string ActionName { get; set; }
public string ControllerName { get; set; }
public string Icon { get; set; }
public List<TreeMenuNode2> Children { get; set; }
}

  2. Json格式

  作为父级目录的名称,ActionName及ControllerName设为空,方便后期处理。如无Children,需将Children设为空数据

{
"treemenu3": {
"MenuNumber": ,
"MenuName": "左侧目录",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "设备信息",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "附属设备",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "新建附属设备",
"ActionName": "Create",
"ControllerName": "Accessory",
"Icon": "fa fa-link",
"Children": []
},
{
"MenuNumber": ,
"MenuName": "附属设备列表",
"ActionName": "Index",
"ControllerName": "Accessory",
"Icon": "fa fa-link",
"Children": []
}
]
}
]
},
{
"MenuNumber": ,
"MenuName": "事件管理",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "设备维护",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "新建维护信息",
"ActionName": "Create",
"ControllerName": "DeviceRepairs",
"Icon": "fa fa-link",
"Children": []
},
{
"MenuNumber": ,
"MenuName": "维护记录列表",
"ActionName": "Index",
"ControllerName": "DeviceRepairs",
"Icon": "fa fa-link",
"Children": []
}
]
},
{
"MenuNumber": ,
"MenuName": "保养维护",
"ActionName": "",
"ControllerName": "",
"Icon": "fa fa-link",
"Children": [
{
"MenuNumber": ,
"MenuName": "新建保养信息",
"ActionName": "Create",
"ControllerName": "Devices",
"Icon": "fa fa-link",
"Children": []
},
{
"MenuNumber": ,
"MenuName": "保养记录列表",
"ActionName": "Index",
"ControllerName": "DeviceRepairs",
"Icon": "fa fa-link",
"Children": []
}
]
}
]
}
]
}
}

三、配置Configuration

关于如何使用类映射配置文件的方法,请参照:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration#custom-config-providers

需安装的Nuget包

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Options.ConfigurationExtensions

1.treemenu.json添加到配置

将treemenu.json保存添加到配置文件中,reloadOnChange表式在Json内容发生变化时,可使用IOptionsSnapshot。

static void Main(string[] args)
{

  var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("treemenu.json");
  Configuration = builder.Build();

}

在startup.cs中的配置:

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

2.映射Json

 var treeMenu3 = Configuration.GetSection("treemenu3").Get<TreeMenuNode2>();

2.1在Startup.cs

 public void ConfigureServices(IServiceCollection services)
{
// Adds services required for using options.
services.AddOptions(); // Register the IConfiguration instance which MyOptions binds against.
services.Configure<TreeMenuNode2>(Configuration.GetSection("treemenu")); // Add framework services.
services.AddMvc();
}

3. 在Controller使用

    public class HomeController : Controller
{
private readonly TreeMenuNode2 _options;
public HomeController(IOptionsSnapshot<TreeMenuNode2> optionsAccessor)
{
_options = optionsAccessor.Value;
}
}

四、重组格式,生成目录树

在后台生成<ul></ul>格式的目录树,此处是在控制台生成相应的格式,可将输出格式复制到网页端进行测试。此处只演示了

 var treeMenu2 = Configuration.GetSection("treemenu3").Get<TreeMenuNode2>();
Console.WriteLine(" <ul class=\"sidebar-menu\">");
PrintTreeMenu2(treeMenu2.Children.Find(a => a.MenuNumber == ));
Console.WriteLine("</ul>");
 private static void PrintTreeMenu2(TreeMenuNode2 treeMenu)
{
if (treeMenu != null)
{ if (!String.IsNullOrWhiteSpace(treeMenu.ActionName) && !String.IsNullOrWhiteSpace(treeMenu.ControllerName))
Console.WriteLine($"<li><a asp-action=\"{treeMenu.ActionName}\" asp-controller=\"{treeMenu.ControllerName}\"><i class=\"{treeMenu.Icon}\"></i><span>{treeMenu.MenuName}</span></a></li>"); if (treeMenu.Children != null)
{
Console.WriteLine("<li class=\"treeview\">");
if (String.IsNullOrWhiteSpace(treeMenu.ActionName) || String.IsNullOrWhiteSpace(treeMenu.ControllerName))
{
Console.WriteLine($"<a href=\"#\"><i class=\"{treeMenu.Icon}\"></i> <span>{treeMenu.MenuName}</span><span class=\"pull-right-container\"><i class=\"fa fa-angle-left pull-right\"></i></span></a>");
}
Console.WriteLine("<ul class=\"treeview-menu\">");
foreach (var item in treeMenu.Children)
PrintTreeMenu2(item);
Console.WriteLine("</ul></li>");
}
}
}

五、网页端的结果

六、结束语

  该篇文章未完善,使用Web时,需在控制器的构造函数中传入(IOptions<TreeMenuNode2> optionsAccessor。

  在Web使用时,可组件成一个String,存在于ViewBag.TreeMenu中,再传入到页面端的相应位置。

在Asp.net core使用配置Json创建动态目录树的更多相关文章

  1. ASP.NET Core的配置(5):配置的同步[设计篇]

    本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二. ...

  2. ASP.NET Core的配置(5):配置的同步[ 实例篇]

    ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程 ...

  3. ASP.NET Core的配置(4):多样性的配置来源[下篇]

    我们在上篇和中篇对配置模型中默认提供的各种ConfigurationProvider进行了深入详尽的介绍,如果它们依然不能满足项目中的配置需求,我们可以还可以通过自定义ConfigurationPro ...

  4. ASP.NET Core的配置(4):多样性的配置来源[中篇]

    我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,针对XML文件的XmlConfiguat ...

  5. ASP.NET Core的配置(4):多样性的配置来源[上篇]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命 ...

  6. ASP.NET Core的配置(3): 将配置绑定为对象[上篇]

    出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...

  7. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  8. ASP.NET Core的配置(1):读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  9. ASP.NET Core - 各项配置

    之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构   ASP.NET Core和上一代F ...

随机推荐

  1. [BZOJ5249][九省联考2018]IIIDX:线段树+贪心

    分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...

  2. F - Almost Sorted Array

    F - Almost Sorted Array   We are all familiar with sorting algorithms: quick sort, merge sort, heap ...

  3. 微信小程序_(视图)简单的swiper容器

    swiper容器效果 官方文档:传送门 swiper容器可实现简单的轮播图效果 结构程序 Page({ /** * 页面的初始数据 */ data: { }, /** * 生命周期函数--监听页面加载 ...

  4. 迷人的bug--torch.load

    利用Google Colab跑了50代的EDSR超分神经网络,然后把网络模型下载到win10上做测试,结果,一直出错,卡了好久 结果百度到这一文章:Pytorch load深度模型时报错:Runtim ...

  5. LeetCode 55. 跳跃游戏(Jump Game)

    题目描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  6. centos6.4编译gcc6.4

    #!/bin/bash dir=$(pwd) echo $dir cd $dir #wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz .tar ...

  7. 搭建jenkins集群node结点

    配置结点 首先,需要在jenkins的系统设置中新增一个结点 系统管理 -> 节点管理 -> New Node 配置Remote root directory最好和主jenkins的路径一 ...

  8. 半硬化树脂PP的型号

    1080是PP半固化胶片的型号(perperg),还有7628,2116,2113,2112,1506等等型号,每种型号不一样代表其PP内部的玻纤布不一样,比如7628的玻纤布相对较粗.数值较小则玻纤 ...

  9. WireShark简单使用以及TCP三次握手

    最近一直在用C#编写服务器端的程序,苦于一直找不到合适的方法来测试网络程序,这篇文章很好的解释了网络程序的底层实现. WireShark是最好的学习网络协议最好的工具. wireshark介绍 wir ...

  10. oracle 四舍五入 取得的数值

    SELECT ROUND( number, [ decimal_places ] ) FROM DUAL 说明: number : 将要处理的数值 decimal_places : 四舍五入,小数取几 ...