api 入門 - Umbraco 4.6+ - C#でdoctypeですべてのノードを取得するには?





テンプレート インストール (5)


私は今日これをやっていましたが、下のコードが(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);
    }
}

Umbraco 4.6+を使用すると、C#で特定のdoctypeのすべてのノードを取得する方法はありますか? 私はumbraco.NodeFactory名前空間を見てきましたが、まだ何も見つかっていません。




または再帰的アプローチ:

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



マクロ(Umbraco 4.7以降)で使用するためのカミソリスクリプトファイルを作成している場合は、この短縮形が特に便利です...

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

これが誰かを助けることを願っています!




umbraco 7.0+では、このようにすることができます

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



SelectMany()使用すると、2番目のSelect()またはループが必要になるような方法で多次元シーケンスを折りたたむことができます。

このブログ記事の詳細。







c# api umbraco