一、前言

  使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在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. Linux下测试CPU性能

    一.安装stress服务 1.下载stress_1.0.1.orig.tar.gz安装包 2.解压tar xvf stress_1.0.1.orig.tar.gz 3.进入解压目录执行./config ...

  2. 分布式-网络通信-IO-基础(2)

    IS 与 OS1. 基本 IO 操作1.1. InputStream 与 OutputStream1.1.1. 输入与输出我们编写的程序除了自身会定义一些数据信息外,经常还会引用外界的数据,或是将自身 ...

  3. 关于MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组.在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. 例如: CREATE TABLE `employee_tbl` ( `id` ...

  4. SNMP命令

    snmp命令 配置管理网络协议Weblogic项目管理Cisco Snmputil 命令 Snmputil是一个命令行下的软件,使用语法如下: usage: snmputil get|getnext| ...

  5. LeetCode 11. 盛最多水的容器(Container With Most Water)

    题目描述 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两 ...

  6. Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一

    下次会为大家深入解析这个小工具.  最先看到这个工具是在EF产品组最新的博客文章上,http://blogs.msdn.com/b/adonet/archive/2011/05/18/ef-power ...

  7. wls12C启用Gzip

    https://community.oracle.com/message/14109820 https://docs.oracle.com/middleware/1221/wls/NOTES/what ...

  8. java操作poi生成excel.xlsx(设置下拉框)下载本地和前端下载

    需求:导入excel表格,如果excel有错误,将错误的地方标红,在把数据以excel的形式写出,供用户下载解决方案:1.以实体类的方式接收excel并解析(创建两个集合一个接收正常的数据一个接收错误 ...

  9. 《FS Book》: 如何让圣诞节邮件营销与众不同

    临近年末,双旦将至,这无疑是一年中最适合进行营销的时候,各大企业都开始进行促销活动,但与此同时,不要忘了问候你的客户,给他们真切的关怀.国内领先的邮件营销服务商Focussend在其最新一期<F ...

  10. zk 两阶段提交(待完善)

    zk 节点是一个 QuorumPeer,选举结束后,leader 和 follower 各自执行自己的逻辑: org.apache.zookeeper.server.quorum.QuorumPeer ...