我目前在简单的MVC Api控制器中具有此功能:
var rootFolder = Umbraco.TypedMedia(200);
return rootFolder.Children().Select(s => new MediaItem
{
Name = s.Name,
Children = s.Children.Select(e => new MediaItem
{
Name = e.Name
})
});
它有效,但仅返回1级和2级。
我尝试使用
return rootFolder.Descendants()
,它返回所有级别的所有结果-但“变平”了,所以我看不到输出中的结构。
输出在一个简单的应用程序中使用,可导航树结构。
关于我如何使其递归的任何想法?
使用后代,输出将像这样返回
[
{
"Name":"dok1"
},
{
"Name":"dok2"
},
{
"Name":"dok21"
}
]
但是应该是
[
{
"Name":"dok1"
},
{
"Name":"dok2"
"Children": [
{
"Name":"dok21"
}
]
}
答案 0 :(得分:0)
不确定此处是否真的需要递归-以下解决方案(或类似方法)应足够
// Dictionary between level/depth(int) and the files on that level/depth
var fileDictionary = new Dictionary<int, List<MediaItem>>();
var children = rootFolder.Children();
var depth = 1;
while (children.Any())
{
var tempList = new List<MediaItem>();
children.ForEach(child => {
tempList.Add(child);
});
fileDictionary.Add(depth, tempList);
children = children.Children();
depth++;
}
然后,您可以执行以下操作:
foreach (var key in fileDictionary.Keys)
{
// Access the key by key.Key (key would be "depth")
// Access the values by fileDictionary[key] (values would be list of MediaItem)
}
答案 1 :(得分:0)
为什么不仅仅创建像这样的递归函数?
IEnumerable<MediaItem> ConvertToMediaItems(IEnumerable<IPublishedContent> items)
{
return items?.Select(i => new MediaItem
{
Name = i.Name,
Children = ConvertToMediaItems(i.Children)
}) ?? Enumerable.Empty<MediaItem>();
}
那么用法是
var rootFolder = Umbraco.TypedMedia(200);
return ConvertToMediaItems(rootFolder.Children());
如果仅在一个地方需要该功能,也可以将该功能设置为局部功能。