代码之家  ›  专栏  ›  技术社区  ›  VinnyG

在Umbraco 4.1中创建UserControl以显示DocumentType列表

  •  2
  • VinnyG  · 技术社区  · 14 年前

    我试图做的是有一个UC连接到Umbraco的DB,获取documentType为“NewsItem”的所有文档,并在我的UC中列出它们。

    我发现这个帖子: Umbraco: List Child Nodes in User Control

    我现在知道有一个API可以访问umbraco的数据,但是没有找到任何例子。我也在umbraco.tv上看了很多视频,但还是不知道最好的方法是什么。还有林克到翁布拉科( http://our.umbraco.org/wiki/reference/api-cheatsheet/linq-to-umbraco )但不确定这是不是个好办法。

    另外,有没有一种方法可以在其他WebProject中测试Usercontrol?我的意思是在另一个项目中连接到Umbraco的db,这样你就不必在Umbraco的网站上进行测试了?

    谢谢!

    1 回复  |  直到 7 年前
        1
  •  4
  •   Tim    11 年前

    你的问题有几个方面,我会一次一个解决。

    1. 使用umbraco.presentation.nodefactory获取特定类型的节点。对于本例,我将假设您的所有新闻项都是特定节点的子项,在本例中为node id 1024。

      using umbraco.presentation.nodeFactory;
      
      namespace cogworks.usercontrols
      {
          public partial class ExampleUserControl : System.Web.UI.UserControl
          {
              protected void Page_Load(object sender, EventArgs e)
              {
                  var specificNode = new Node(1024);
                  var childNodes = specificNode.Children;
      
                  foreach(var node in childNodes)
                  {
                      if(node.NodeTypeAlias == "NewsItem")
                      {
                          //Do something with your NewsItem node!
                      }
                  }
              }
          }
      }
      

    这可能不是最有效的方法,但可以作为一个例子。

    1. 递归遍历节点树并将找到的节点添加到列表的示例:

      public static List<Node> SelectChildrenByNameRecursive(Node node, string docType)
      {
          var nodes = new List<Node>();
      
          foreach (Node child in node.Children)
          {
              FindChildrenByDocType(child, docType, ref nodes);
          }
      
          return nodes;
      }
      
      private static void FindChildrenByDocType(Node node, string docType, ref List<Node> nodes)
      {
          if (node.NodeTypeAlias == docType)
          {
              nodes.Add(node);
          }
      
          foreach (Node childNode in node.Children)
          {
              FindChildrenByDocType(childNode, docType, ref nodes);
          }
      }
      

    1. 在测试Umbraco时,您始终需要在Umbraco的实例中运行,因为nodefactory是内存内容缓存之上的API。

    2. 进一步阅读

    http://blog.hendyracher.co.uk/umbraco-helper-class/

    http://our.umbraco.org/wiki/how-tos/useful-helper-extension-methods-(linq-null-safe-access)