2011-02-16 10 views
17

उम्ब्राको 4.6+ का उपयोग करना, सी # में एक विशिष्ट सिद्धांत के सभी नोड्स को पुनर्प्राप्त करने का कोई तरीका है? मैं umbraco.NodeFactory नामस्थान में देख रहा हूं, लेकिन अभी तक उपयोग में कुछ भी नहीं मिला है।उम्ब्राको 4.6+ - सी # में डॉक्ट टाइप द्वारा सभी नोड्स कैसे प्राप्त करें?

उत्तर

16

मैं आज यह कर रहा था, नीचे दिए गए कोड की तरह कुछ काम करना चाहिए (umbraco.presentation.nodeFactory का उपयोग करके), इसे साइट के रूट नोड प्राप्त करने के लिए -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 आईडी के रूप में! उसके लिए धन्यवाद – 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") 

तो अगर आप केवल पहले पांच प्राप्त करना चाहते हैं, तो आप .Take (5) अंत करने के लिए जोड़ सकते हैं और आप करेंगे केवल पूरे पेड़ को खींचने के बजाय पहले 5 परिणामों के माध्यम से रिकर्स करें।

1

तुम सिर्फ एक रेजर पटकथा फ़ाइल बना रहे हैं एक मैक्रो (Umbraco 4.7+) द्वारा इस्तेमाल किया जा करने के लिए, मैं इस आशुलिपि विशेष रूप से उपयोगी पाया ...

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

आशा इस किसी मदद करता है!

1

Umbraco में 7.0+ आप साइट के रूट नोड के लिए एक महान टिप है प्राप्त करने के लिए इस

foreach (var childNode in node.Children<ChildNodeType>()) 
{ 
... 
} 
संबंधित मुद्दे