我正在尝试创建自定义树,并且在尝试渲染节点子节点时遇到了麻烦。在浏览了各种文章/帖子之后我就在这一点上:
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个参数。我假设上面的方法适用于早期版本?
答案 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
}