2017-02-28 11 views
1

メニューを作成するための再帰的なメソッドを作成しようとしています。 達成したいメニューには、子供の子供などが表示されます。 私はコードをデバッグし、 "最年少の子供"に至るまで行きました。再帰メソッドは子孫の子をループしません

public string GetMenu(Node currentPage) 
    { 
     StringWriter stringWriter = new StringWriter(); 
     using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter)) 
     { 

     foreach (var item in currentPage.ChildrenAsList) 
     { 
      writer.RenderBeginTag(HtmlTextWriterTag.Li); 
      writer.AddAttribute(HtmlTextWriterAttribute.Href, item.Url); 
      writer.RenderBeginTag(HtmlTextWriterTag.A); 
      writer.Write(item.Name); 


      if (item.ChildrenAsList.Any()) 
      { 
       writer.RenderBeginTag(HtmlTextWriterTag.Ul); 
       GetMenu(new Node(item.Id)); 
       writer.RenderEndTag(); 
      } 
      writer.RenderEndTag(); 
      writer.RenderEndTag(); 
     } 
    } 
    return stringWriter.ToString(); 
} 

この方法では、出力を与える:

<ul class="nav nav-sidebar"> 

    <li> 
    <a href="/artikelsida001/">Artikelsida001 
    <ul> 

    </ul> 
    </a></li> 
    <li><a href="/patrikartikelsida/">PatrikArtikelsida 
    <ul> 

    </ul> 
    </a></li> 
    <li><a href="/en-testsida/">En testsida</a></li> 
    </ul> 
+2

質問をするのを忘れたと思います。私はあなたに 'GetMenu(新しいノード(item.Id))への応答を投げ捨てることと何か関係があると思う。 – Jamiec

+0

申し訳ありません@MongZhu、それは私の最初の投稿ですので、それを数回書き直して良い。明らかにそれはうまくいきませんでした。とにかくJonはすでにそれを解決しました、とにかくありがとう! :) –

+0

@PatrikJansson心配しないでください。投稿の下に[編集ボタン](http://stackoverflow.com/posts/42509835/edit)を使用して、投稿に情報を追加することができます。それは石で彫られていません;)幸いにも –

答えて

4

あなたがGetMenuを呼び出すたびに、あなたは新しいStringWriterを作成している - しかし、あなたはあなたの再帰呼び出しからの戻り値を無視しています。再帰が今同じ作家RenderMenuを呼び出す方法

public string GetMenu(Node currentPage) 
{ 
    var stringWriter = new StringWriter(); 
    using (var htmlWriter = new HtmlTextWriter(stringWriter)) 
    { 
     RenderMenu(currentPage, writer); 
    } 
    return stringWriter.ToString(); 
} 

private void RenderMenu(Node node, HtmlTextWriter writer) 
{ 
    // Mostly copied from the code in the question... 
    foreach (var item in currentPage.ChildrenAsList) 
    { 
     writer.RenderBeginTag(HtmlTextWriterTag.Li); 
     writer.AddAttribute(HtmlTextWriterAttribute.Href, item.Url); 
     writer.RenderBeginTag(HtmlTextWriterTag.A); 
     writer.Write(item.Name); 

     if (item.ChildrenAsList.Any()) 
     { 
      writer.RenderBeginTag(HtmlTextWriterTag.Ul); 
      // Note the change here 
      RenderMenu(new Node(item.Id), writer)); 
      writer.RenderEndTag(); 
     } 
     writer.RenderEndTag(); 
     writer.RenderEndTag(); 
    } 
} 

注:最も簡単な修正は、おそらくそれを変更することです。

+0

ああ、問題を解決したおかげで感謝! –

関連する問題