创建用户控件以在Umbraco 4.1中显示文档类型列表

时间:2010-07-14 16:07:27

标签: c# user-controls umbraco

我是Umbraco的新手,到目前为止我喜欢它,我理解它是如何工作的但是我想知道如何以及最好的方法来创建显示来自umbraco数据库的一些信息的用户控件?当它很简单时,我使用XSL模板,但现在我需要更多的可能性。

我尝试做的是拥有连接到Umbraco数据库的UC,获取documentType“NewsItem”的所有文档并将其列在我的UC中。

我发现这篇文章:Umbraco: List Child Nodes in User Control但它并不完全,因为我不想对nodeId进行硬编码,我想根据DocumentType找到我的新闻。

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

另外,有没有办法在其他WebProject中测试Usercontrol?我的意思是在另一个项目中连接到Umbraco的数据库,这样你就不必进入umbraco的网站进行测试了吗?

非常感谢!

1 个答案:

答案 0 :(得分:4)

您的问题有几个方面我会尝试一次解决一个问题。

  1. 使用umbraco.presentation.nodefactory获取特定类型的节点。对于此示例,我将假设所有NewsItem都是特定节点的子节点,在这种情况下节点标识为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!
                    }
                }
            }
        }
    }
    
  2. 这可能不是最有效的方法,但可以作为一个例子。

    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);
          }
      }
      
    2. 再次只是示例代码......

      1. 测试Umbraco,你总是需要在Umbraco的一个实例中运行,因为nodefactory是一个位于内存内容缓存之上的API。

      2. 进一步阅读

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

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