2

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

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 = new TreeService(...);
node.Source = treeService.GetServiceUrl();

但是我收到一条错误消息,说没有 GetServiceUrl 方法需要 0 个参数。我假设上述方法适用于早期版本?

4

2 回答 2

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);
  }
}
于 2012-08-16T03:26:52.400 回答
1

输出表明您正在构建的节点树正在嵌套每个子节点 - 这是因为 nodeId 在每次 pass 时都被重置为 -1

our.umbraco.org 上的这篇文章描述了同样的问题,并建议您使用 NodeKey 而不是 ID 在节点之间移动。

**

不一定有帮助,但我会使用ucomponents 包附带的uQuery 语言扩展(以及谁在没有 ucomponents 的情况下安装 Umbraco?),以简化方法调用:

例如:

List<Node> articles = uQuery.getNodesByType("Promoter");
foreach(Node article in articles)
{
  List<Node> children = article.GetDescendantNodes();
  ... build tree
}
于 2012-07-30T12:57:22.793 回答