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

时间:2011-02-16 16:33:55

标签: c# api umbraco

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

5 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:15)

假设您最终只需要特定类型的几个节点,那么使用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个结果递归,而不是拉出整个树。

答案 2 :(得分: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...
}

答案 3 :(得分:1)

如果您只是创建一个由宏(Umbraco 4.7+)使用的剃刀脚本文件,我发现这个简写特别有用......

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

希望这有助于某人!

答案 4 :(得分:1)

在umbraco 7.0+中你可以这样做

foreach (var childNode in node.Children<ChildNodeType>())
{
...
}