Umbraco 4.6+ – 如何通过C#中的doctype获取所有节点?

使用Umbraco 4.6+,有没有办法在C#中检索特定doctype的所有节点? 我一直在寻找umbraco.NodeFactory命名空间,但还没有发现任何有用的东西。

我今天刚刚这样做,类似下面的代码应该工作(使用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); } } 

假设您最终只需要特定类型的几个节点,那么使用yield关键字来避免检索的次数会比以下更高效:

 public static IEnumerable 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 FindChildren(Node currentNode, Func predicate) { List result = new List(); var nodes = currentNode .Children .OfType() .Where(predicate); if (nodes.Count() != 0) result.AddRange(nodes); foreach (var child in currentNode.Children.OfType()) { 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 4.7+)使用的剃刀脚本文件,我发现这个速记特别有用……

 var nodes = new Node(-1).Descendants("DocType").Where("Visible"); 

希望这有助于某人!

在umbraco 7.0+中你可以这样做

 foreach (var childNode in node.Children()) { ... }