【问题标题】:Create UserControl to display a list of DocumentType in Umbraco 4.1创建 UserControl 以在 Umbraco 4.1 中显示 DocumentType 列表
【发布时间】:2010-07-14 16:07:26
【问题描述】:

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

我尝试做的是让 UC 连接到 Umbraco 的数据库,获取 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 中测试用户控件?我的意思是在其他项目中连接Umbraco的db,这样就不用去umbraco的网站测试了?

非常感谢!

【问题讨论】:

    标签: c# user-controls umbraco


    【解决方案1】:

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

    1. 使用 umbraco.presentation.nodefactory 获取特定类型的节点。对于本例,我将假设您的所有 NewsItems 都是特定节点的子节点,在本例中节点 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)

    【讨论】:

    • 感谢蒂姆的回答!您如何看待 Linq to Umbraco?我们可以在单独的 Web 项目中对其进行测试吗?您在此处提供的有用链接!但是有没有什么方法可以使用 DB 而不必在 Umbraco 中测试我们的控件,以便更好地分离并向我的 UC 添加单元测试?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多