Umbraco自定义部分中的多级树

时间:2012-07-30 07:18:38

标签: c# .net tree umbraco

我正在尝试创建自定义树,并且在尝试渲染节点子节点时遇到了麻烦。在浏览了各种文章/帖子之后我就在这一点上:

public override void Render(ref XmlTree tree)
{
  List<Node> articles = NodeUtil.GetAllNodesOfDocumentType(-1, "Promoter");
  Node article = articles.Where(p => p.CreatorID == UmbracoEnsuredPage.CurrentUser.Id).FirstOrDefault();

  if(promo != null)
  {
      var dNode = XmlTreeNode.Create(this);
      dNode.NodeID = article.Id.ToString();
      dNode.Text = article.Name;
      dNode.Icon = "doc.gif";
      dNode.Action = "javascript:openArticle(" + article.Id + ")";
      dNode.Source = article.Children.Count > 0 ? this.GetTreeServiceUrl("" + article.Id) : "";
      tree.Add(dNode);
  }
}

上面的代码获取属于当前用户的文章(为了测试,每个用户此刻只有一篇文章)。然后我尝试打印出这篇文章的孩子,但不是得到所需的输出,我得到了以下内容:

Article Name
- Article Name
  - Article Name
   - Article Name

每次我展开一个节点时,它似乎只呈现相同的节点,然后继续。

我已经看到了使用treeservice的其他方法,例如:

TreeService treeService = new TreeService(...);
node.Source = treeService.GetServiceUrl();

但是我得到一个错误,说没有GetServiceUrl方法接受0个参数。我假设上面的方法适用于早期版本?

2 个答案:

答案 0 :(得分:2)

我花了一段时间来解决这个问题。这是解决方案,希望它能帮助别人。

const string PARENT_ID = "10"; // The ID of the node that has child nodes

public override void Render(ref XmlTree tree)
{
  if (this.NodeKey == PARENT_ID) // Rendering the child nodes of the parent folder
  {
    // Render a child node
    XmlTreeNode node = XmlTreeNode.Create(this);
    node.NodeID = "11";
    node.Text = "child";
    node.Icon = "doc.gif";
    node.Action = ...
    tree.Add(node);
  }
  else // Default (Rendering the root)
  {
    // Render the parent folder
    XmlTreeNode node = XmlTreeNode.Create(this);
    node.NodeID = PARENT_ID;
    node.Source = this.GetTreeServiceUrl(node.NodeID);
    node.Text = "parent";
    node.Icon = "folder.gif";
    tree.Add(node);
  }
}

答案 1 :(得分:1)

输出表明您正在构建的节点树正在嵌套每个子节点 - 这是because the nodeId is being reset to -1 with each pass

our.umbraco.org上的

This post描述了同样的问题,并建议您使用NodeKey而不是ID在节点之间移动。

**

不一定有用,但我会使用ucomponents包附带的uQuery language extensions(以及安装没有ucomponents的Umbraco?),以简化方法调用:

例如:

List<Node> articles = uQuery.getNodesByType("Promoter");
foreach(Node article in articles)
{
  List<Node> children = article.GetDescendantNodes();
  ... build tree
}