【问题标题】:Umbraco 4.6+ - How to get all nodes by doctype in C#?Umbraco 4.6+ - 如何在 C# 中按 doctype 获取所有节点?
【发布时间】:2011-06-28 11:59:13
【问题描述】:

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

【问题讨论】:

    标签: c# api umbraco


    【解决方案1】:

    在 umbraco 7.0+ 中你可以这样做

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

    【讨论】:

      【解决方案2】:

      如果您只是创建一个 razor 脚本文件以供宏(Umbraco 4.7+)使用,我发现这个速记特别有用...

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

      希望这对某人有所帮助!

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          或递归方法:

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

          【讨论】:

            【解决方案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);
                }
            }
            

            【讨论】:

            • 使用 -1 作为 id 来获取站点的根节点是一个很好的技巧!谢谢你
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-02
            • 1970-01-01
            • 1970-01-01
            • 2014-09-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多