在Asp.net core使用配置Json创建动态目录树
一、前言
使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在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创建动态目录树的更多相关文章
- ASP.NET Core的配置(5):配置的同步[设计篇]
本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二. ...
- ASP.NET Core的配置(5):配置的同步[ 实例篇]
ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程 ...
- ASP.NET Core的配置(4):多样性的配置来源[下篇]
我们在上篇和中篇对配置模型中默认提供的各种ConfigurationProvider进行了深入详尽的介绍,如果它们依然不能满足项目中的配置需求,我们可以还可以通过自定义ConfigurationPro ...
- ASP.NET Core的配置(4):多样性的配置来源[中篇]
我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,针对XML文件的XmlConfiguat ...
- ASP.NET Core的配置(4):多样性的配置来源[上篇]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,ASP.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命 ...
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...
- ASP.NET Core的配置(2):配置模型详解
在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...
- ASP.NET Core的配置(1):读取配置信息
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- ASP.NET Core - 各项配置
之前搭建好了各项开发环境,现在来说说ASP.NET Core的各项配置.项目结构.以及在请求管道中挂载的各式各样的中间件.今天先来探讨探讨其各项配置及其项目结构 ASP.NET Core和上一代F ...
随机推荐
- ORA-01652: 无法通过 128 (在表空间 HIS_TABLESPACE_TEMP 中) 扩展 temp 段
前言:采用jmeter进行压力测试,大概向oracle 添加了140W条数据. 结果系统涉及到该表的业务都异常卡.访问阿里巴巴的那个druid monitor,因为系统中集成了,查看sql监控中的sq ...
- 当 LAST_INSERT_ID() 带有参数时# 清空重来
[root@yejr.me]> truncate table t; # 插入1条新记录[root@yejr.me]> insert into t select 0,rand()*1024; ...
- C++入门经典-例3.1-判断输入的数字是否为奇数
1:代码如下: // 3.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...
- XML文件报错dubbo:XX解决方法
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- vue项目内嵌入到app input type=file 坑(文件上传插件)
w问题描述: 我用vue-cli完成的一个移动端项目,内嵌到app当中,用原生的input type=file 来完成文件上传.在安卓下没有问题但是在苹果手机 上传第二次手机就会发生白屏 并无缘无故跳 ...
- 32位下操作mongodb心得
本文出处:http://blog.csdn.net/chaijunkun/article/details/7236911,转载请注明. 随着互联网的变革,互联网的内容生成方式也逐渐地从网站生成转为用户 ...
- vscode 配置go环境 可调试
1.go下载安装并配置环境变量 2.安装工具: 1)安装gocode go get -u -v github.com/nsf/gocode 2)安装godef go get -u -v githu ...
- [Java]分解算术表达式一
源码: package com.hy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...
- GetRGB下载
下载地址:https://pan.baidu.com/s/11EyUPa2WxhIgdsTRZtj_eg 07年6-8月做的,用于屏幕取色. 2019年8月30日13点50分
- C语言转义字符表和ASCII码表
主要参考 http://www.51hei.com/mcu/4342.html 以及 https://www.cnblogs.com/jason207489550/p/6663444.html