在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": 0,
    "MenuName": "左侧目录",
    "ActionName": "",
    "ControllerName": "",
    "Icon": "fa fa-link",
    "Children": [
      {
        "MenuNumber": 1,
        "MenuName": "设备信息",
        "ActionName": "",
        "ControllerName": "",
        "Icon": "fa fa-link",
        "Children": [
          {
            "MenuNumber": 1000,
            "MenuName": "附属设备",
            "ActionName": "",
            "ControllerName": "",
            "Icon": "fa fa-link",
            "Children": [
              {
                "MenuNumber": 1010,
                "MenuName": "新建附属设备",
                "ActionName": "Create",
                "ControllerName": "Accessory",
                "Icon": "fa fa-link",
                "Children": []
              },
              {
                "MenuNumber": 1020,
                "MenuName": "附属设备列表",
                "ActionName": "Index",
                "ControllerName": "Accessory",
                "Icon": "fa fa-link",
                "Children": []
              }
            ]
          }
        ]
      },
      {
        "MenuNumber": 2,
        "MenuName": "事件管理",
        "ActionName": "",
        "ControllerName": "",
        "Icon": "fa fa-link",
        "Children": [
          {
            "MenuNumber": 2000,
            "MenuName": "设备维护",
            "ActionName": "",
            "ControllerName": "",
            "Icon": "fa fa-link",
            "Children": [
              {
                "MenuNumber": 2010,
                "MenuName": "新建维护信息",
                "ActionName": "Create",
                "ControllerName": "DeviceRepairs",
                "Icon": "fa fa-link",
                "Children": []
              },
              {
                "MenuNumber": 2020,
                "MenuName": "维护记录列表",
                "ActionName": "Index",
                "ControllerName": "DeviceRepairs",
                "Icon": "fa fa-link",
                "Children": []
              }
            ]
          },
          {
            "MenuNumber": 2100,
            "MenuName": "保养维护",
            "ActionName": "",
            "ControllerName": "",
            "Icon": "fa fa-link",
            "Children": [
              {
                "MenuNumber": 2010,
                "MenuName": "新建保养信息",
                "ActionName": "Create",
                "ControllerName": "Devices",
                "Icon": "fa fa-link",
                "Children": []
              },
              {
                "MenuNumber": 2020,
                "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();
        }

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

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

 var treeMenu2 = Configuration.GetSection("treemenu3").Get<TreeMenuNode2>();
            Console.WriteLine(" <ul class=\"sidebar-menu\">");
            PrintTreeMenu2(treeMenu2.Children.Find(a => a.MenuNumber == 2));
            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),还未使用IOptionsSnapshot。

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

时间: 2024-09-29 22:07:37

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

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

本节所谓的"配置同步"主要体现在两个方面:其一,如何监控配置源并在其变化的时候自动加载其数据,其目的是让应用中通过Configuration对象承载的配置与配置源的数据同步:其二.当Configuration对象承载的配置放生变换的时候如何向应用程序发送通知,最终让应用程序使用最新的配置. 一.配置与配置源的同步 配置模型提供了三个原生ConfigurationProvider(JsonConfigrationProvider.XmlConfigurationProvider和IniC

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

ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程序中的使用的配置信息如何与之同步呢?如果需要在应用程序中实现对配置信息的实施同步,就需要对原始配置数据的进行监控,并在数据改变的时候重新加载配置数据.除此之外,重新加载的配置需要应用到程序中,我们必然需要一种通知机制. 为了让读者朋友们对配置同步机制在具体项目中的应用有个感官认识,我们先通过一个简单

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

出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Options对象.我们在本章第一节通过简单的实例演示了如何利用Options模型实现了配置数据向Options对象的绑定,现在我们对Options模型背后的实现原理进行详细介绍. 目录一.ConfigurationBinder二.绑定简单对象三.绑定复杂对象四.绑定集合对象五.绑定字典对象 一.Conf

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

我们在<读取配置信息>通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编写的程序.如下面的代码片段所示,基于Options模型的配置绑定的编程基本采用这样的模式:先后调用ServiceCollection的扩展方法AddOption和Configure注册Options模型相关的服务并完成Options类型与指定配置节之间的映射,然后利用由此生成ServiceProvider获得一个类型为IOptions&

Asp.net core 环境配置

参考: 在 ASP.NET Core 中使用多个环境 ASP.NET Core 中的配置 在项目的 Properties\launchSettings.json中可以配置多个环境 { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl"

在ASP.NET Core 2.2 中创建 Web API并结合Swagger

一.创建 ASP.NET Core WebApi项目 二.添加 三. ----------------------------------------------------------- 一.创建项目,WideWorldImporters.API,选项按照下列图操作 二.引用需要的Nuget包 Microsoft.EntityFrameworkCore.SqlServer Swashbuckle.AspNetCore Swashbuckle.AspNetCore包允许为Web API启用帮助页

(17)ASP.NET Core EF基于数据模型创建数据库

1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上使用Visual Studio 2017 PowerShell或在Windows.macOS或Linux上使用.NET Core CLI来学习创建数据库. 2.创建新项目 2.1系统必备 在创建新项目之前都要检查是否安装以下软件:●具有以下工作负载的Visual Studio 2017 15.7版或

ASP.NET Core中返回 json 数据首字母大小写问题

asp.net core  默认输出的json数据首字母会改成小写,考虑可能是为了前端js的书写习惯,毕竟js 操作大小写敏感. 在Startup类的ConfigureServices()方法中进行配置,DefaultContractResolver() 原样输出,返回的 json 与后台定义一致 // This method gets called by the runtime. Use this method to add services to the container. public

asp.net core 2.0 Json结果的格式

asp.net core 2.0 默认返回的结果格式是Json, 并使用json.net对结果默认做了camel case的转化(大概可理解为首字母小写). 这一点与老.net web api 不一样, 原来的 asp.net web api 默认不适用任何NamingStrategy, 需要手动加上camelcase的转化. 如果非得把这个规则去掉, 那么就在configureServices里面改一下: public void ConfigureServices(IServiceCollec