2017-02-28 170 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

我想你忘了問一個問題。 BUt我懷疑它與你對GetMenu(新節點(item.Id))的迴應有關。' – Jamiec

+0

對不起@MongZhu,這是我在這裏的第一篇文章,所以我重寫了幾次,使它成爲好。顯然它沒有那麼好。無論如何Jon已經解決了,謝謝! :) –

+0

@PatrikJansson別擔心。您可以使用您帖子下方的[編輯按鈕](http://stackoverflow.com/posts/42509835/edit)將信息添加到您的帖子中。它不是刻在石頭上)幸運 –

回答

4

每次調用GetMenu的時候,你要創建一個新的StringWriter - 但你忽略了從遞歸調用的返回值。最簡單的修復很可能是將其改爲:

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

注意遞歸現在怎麼調用RenderMenu同一位作家

+0

啊,謝謝,這解決了問題! –