Преобразуйте структуру каталогов строкового пути с помощью рекурсии в объект JSON с c# и MVC - PullRequest
0 голосов
/ 05 августа 2020

Я создаю древовидное представление, используя кендо в MVC, вход, который у меня есть, - это Список таких путей:

List<string> FileList =
"Root/Folder1/SubFolder1/excel.xls",
"Root/Folder1/SubFolder1/word.doc",
"Root/Folder1/SubFolder1/access.xls",
"Root/Folder1/SubFolder1/subfolder2"

Мне нужно создать иерархический json объект с Следующая модель:

public class Item
{
    public int id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
    public string Path { get; set; }
    public List<Item> Items { get; set; }
}

Мне нужно создать контроллер, который с помощью рекурсивного метода может создавать и возвращать json следующим образом: Я пытался реализовать рекурсию, но результат неверен. Не могли бы вы мне помочь?

data = [
  {
    id: 1,
    Title:Root
    path: "Root/"
    children: [
      {
        Id:2 
        Title: "Folder1",
        ParentId:1
        path: "Root/Folder1/"
        children: [
          {
            Id:3 
            Title: "SubFolder1",
            ParentId:2
            path: "Root/Folder1/SubFolder1/"
            children: [
              {
                Id:4 
                Title: "excel.xls",
                ParentId:3,
                path: "Root/Folder1/SubFolder1/excel.xls"
              }, 
              {
                Id:5 
                Title: "word.doc",
                ParentId:3
                path: "Root/Folder1/SubFolder1/excel.xls"
              },
              {
                Id:6 
                Title: "access.xls",
                ParentId:3
                path: "Root/Folder1/SubFolder1/excel.xls"
              },
              {
                Id:6 
                Title: "access.xls",
                ParentId:3
                path: "Root/Folder1/SubFolder1/subfolder2"
              }
            ]
          }
        ]
      }
    ]
  }
];

Это мой код:

public JsonResult GetCultureTemplateFiles(string culture)
    {
        //Connect to Storage Account
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["**********"].ConnectionString);

        // Create the blob client.
        var blobClient = storageAccount.CreateCloudBlobClient();

        //Find Blob Container
        var TemplateContainer = blobClient.GetContainerReference("*************");

        // Get FileList from Container filtered by culture
        List<IListBlobItem> FileList = TemplateContainer.ListBlobs(culture + "/", true).ToList();
        
        List<KendoItem> jsonTreeObj = new List<KendoItem>();
        
        var i = 1;

        foreach (var file in FileList)
        {
            //remove the language component from the path
            var operatingFile = ((CloudBlockBlob)file).Name.Substring(((CloudBlockBlob)file).Name.IndexOf('/') + 1);

            var dir = operatingFile;

            //split the path
            var dirList = dir.Split('/').ToList();

            //Add Directories for given path to the collection
            
            KendoItem node = new KendoItem();
            
            foreach (var ele in dirList)
            {
                var index = dirList.IndexOf(ele);
                if (index == 0)
                {
                    if (jsonTreeObj.FirstOrDefault(x => x.Text == ele) == null)
                    {
                        node.Id = i;
                        node.ParentId = null;
                        node.Text = ele;

                        jsonTreeObj.Add(node);
                    }
                }
                else
                {
                    node.Items = new List<KendoItem>();
                    node.Items = (WalkStringPath(ele, i, node));
                }

                i++;
            }

            
        }
        return Json(jsonTreeObj);
    }

    public List<KendoItem> WalkStringPath(string ele, int i, KendoItem lastNode)
    {
        var parentId = lastNode.Id;
        if (parentId >= i)
        {
            return null;
        }
        
        KendoItem node = new KendoItem();
        node.Id = i;
        node.ParentId = parentId;
        node.Text = ele;

        lastNode.Items.Add(node);

        return lastNode.Items;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...