一、前言

  使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在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. cursor url 自定义鼠标样式

    cursor可以自定义鼠标,写法是cursor:url(“图片路径”),pointer; url:需使用的自定义光标的 URL.图片类型需要是.cur或.ani和jpg,png等格式的(.cur或.a ...

  2. Unity3D_(游戏)卡牌01_启动屏界面

      卡牌2D游戏展示 (游戏代码放到  卡牌04_游戏界面  文章最后面~) 游戏项目已托管到github上(里面有个32bit可执行文件) 传送门 规则 开始游戏每张卡牌初始翻开展示 展示几秒后卡牌 ...

  3. 分布式-信息方式-ActiveMQ的集群

    ActiveMQ的集群Queue consumer clusters              ActiveMQ支持 Consumer对消息高可靠性的负载平衡消费,如果一个 Consumer死掉,该消 ...

  4. js对象深拷贝、浅拷贝

    浅拷贝1 //浅拷贝1 let obj01 = { name: 'Lily', age: '20', time: ['13', '15'], person: { name: 'Henry', age: ...

  5. 【Linux】单计算机安装PBS系统(Torque)与运维

    1.此次使用torque-5.0.0-1_43d8f09a.tar.gz这个版本http://www.adaptivecomputing.com/downloading/?file=/torque/t ...

  6. linux系统问题排查

    通常linux系统出问题了 先看系统日志 tail -f /var/log/messages

  7. deepClone deepCompare

    一.深度复制 // 深度复制 function deepClone(datas) { if (typeof datas !== 'object' || datas === null) return d ...

  8. C语言转义字符表和ASCII码表

    主要参考 http://www.51hei.com/mcu/4342.html 以及 https://www.cnblogs.com/jason207489550/p/6663444.html

  9. leetcode171 Excel列表序列号

    /** 可看做26进制到10进制转换问题:v=26*v+s[i]-'A'; **/ class Solution { public: int titleToNumber(string s) { ; f ...

  10. git使用遇到的问题

    1.我新建了一个django项目,然后又在git上新建了一个仓库,然后我在django的项目文件内,将git上的项目clone到这个文件内的时候 git clone https://gitee.com ...