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);
  }
}

上記のコードは、現在のユーザーに属する記事を取得します (テストのため、各ユーザーは現時点で 1 つの記事しか持っていません)。次に、この記事の子を印刷しようとしましたが、目的の出力を取得する代わりに、次の結果が得られました。

Article Name
- Article Name
  - Article Name
   - Article Name

ノードを展開するたびに、同じノードをレンダリングしているように見え、延々と続きます。

次のように、ツリーサービスを使用する他の方法を見てきました。

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

しかし、0 引数を取る GetServiceUrl メソッドがないというエラーが表示されます。上記の方法は以前のバージョンのものだったと思いますか?

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 が -1 にリセットされているためです。

our.umbraco.org のこの投稿でも同じ問題が説明されており、ID の代わりに NodeKey を使用してノード間を移動することを提案しています。

**

必ずしも役立つとは限りませんが、メソッド呼び出しを簡素化するために、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 に答える