Umbraco 4.6+ - Как получить все узлы по типу в C #? - PullRequest
17 голосов
/ 16 февраля 2011

Используя Umbraco 4.6+, есть ли способ получить все узлы определенного типа документа в C #? Я искал в пространстве имен umbraco.NodeFactory, но пока не нашел ничего полезного.

Ответы [ 5 ]

16 голосов
/ 16 февраля 2011

Я только что делал это сегодня, что-то вроде приведенного ниже кода должно работать (с использованием umbraco.presentation.nodeFactory), вызывать его с ID узла равным -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);
    }
}
15 голосов
/ 02 декабря 2011

Предполагая, что в конечном итоге вам понадобится только пара узлов определенного типа, было бы более эффективно использовать ключевое слово 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 результатов, а невытащить целое дерево.

3 голосов
/ 12 августа 2011

Или рекурсивный подход:

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...
}
1 голос
/ 26 августа 2016

В umbraco 7.0+ вы можете сделать это следующим образом

foreach (var childNode in node.Children<ChildNodeType>())
{
...
}
1 голос
/ 24 января 2013

Если вы просто создаете файл сценария для бритвы, который будет использоваться макросом (Umbraco 4.7+), я нашел это сокращение особенно полезным ...

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

Надеюсь, это кому-нибудь поможет!

...