2011-02-16 4 views

답변

16

내가 오늘이 일을하고 있었는데, 아래 코드가 (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); 
    } 
} 
+0

처럼 할 수 -1 ID와 사이트의 루트 노드가 좋은 팁입니다 얻을! 고마워. – ComethTheNerd

3

또는 재귀 방법 :

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... 
} 
15

은 결국 당신을 가정하면이 특정 유형의 노드의 몇 가지가 필요합니다, 당신보다 더 많은 검색 방지하기 위해 항복 키워드를 사용하는 것이 더 효율적이 될 것입니다 해야만합니다 :

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") 

을 그래서, 당신은 (5) 끝으로 .Take을 추가 할 수 있으며 것입니다 전체 트리를 꺼내기보다는 처음 5 가지 결과 만 반복합니다. 그냥 매크로 (Umbraco 4.7+)가 사용하는 면도칼 스크립트 파일을 만드는 경우, 나는 특히 유용 줄여서 발견

1

...

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

희망이 누군가를하는 데 도움이! umbraco에서

1

은 7.0 당신은 사용이

foreach (var childNode in node.Children<ChildNodeType>()) 
{ 
... 
} 
관련 문제