【发布时间】:2011-06-28 11:59:13
【问题描述】:
使用 Umbraco 4.6+,有没有办法在 C# 中检索特定文档类型的所有节点?我一直在寻找 umbraco.NodeFactory 命名空间,但还没有找到任何有用的东西。
【问题讨论】:
使用 Umbraco 4.6+,有没有办法在 C# 中检索特定文档类型的所有节点?我一直在寻找 umbraco.NodeFactory 命名空间,但还没有找到任何有用的东西。
【问题讨论】:
在 umbraco 7.0+ 中你可以这样做
foreach (var childNode in node.Children<ChildNodeType>())
{
...
}
【讨论】:
如果您只是创建一个 razor 脚本文件以供宏(Umbraco 4.7+)使用,我发现这个速记特别有用...
var nodes = new Node(-1).Descendants("DocType").Where("Visible");
希望这对某人有所帮助!
【讨论】:
假设您最终只需要几个特定类型的节点,那么使用 yield 关键字来避免检索超出您的需要会更有效:
public static IEnumerable<INode> GetDescendants(this INode node)
{
foreach (INode child in node.ChildrenAsList)
{
yield return child;
foreach (INode grandChild in child.GetDescendants())
{
yield return grandChild;
}
}
yield break;
}
因此,您按类型获取节点的最终调用将是:
new Node(-1).GetDescendants().Where(x => x.NodeTypeAlias == "myNodeType")
所以如果你只想得到前五个,你可以添加 .Take(5) 到最后,你只会递归前 5 个结果而不是拉出整个树。
【讨论】:
或递归方法:
using umbraco.NodeFactory;
private static List<Node> FindChildren(Node currentNode, Func<Node, bool> predicate)
{
List<Node> result = new List<Node>();
var nodes = currentNode
.Children
.OfType<Node>()
.Where(predicate);
if (nodes.Count() != 0)
result.AddRange(nodes);
foreach (var child in currentNode.Children.OfType<Node>())
{
nodes = FindChildren(child, predicate);
if (nodes.Count() != 0)
result.AddRange(nodes);
}
return result;
}
void Example()
{
var nodes = FindChildren(new Node(-1), t => t.NodeTypeAlias.Equals("myDocType"));
// Do something...
}
【讨论】:
我今天刚刚这样做,类似下面的代码应该可以工作(使用 umbraco.presentation.nodeFactory),使用 nodeId 为 -1 调用它以获取站点的根节点并让它工作下去:
private void DoSomethingWithAllNodesByType(int NodeId, string typeName)
{
var node = new Node(nodeId);
foreach (Node childNode in node.Children)
{
var child = childNode;
if (child.NodeTypeAlias == typeName)
{
//Do something
}
if (child.Children.Count > 0)
GetAllNodesByType(child, typeName);
}
}
【讨论】: