【问题标题】:Recursive method wont loop childs children递归方法不会循环孩子的孩子
【发布时间】:2017-07-19 11:42:46
【问题描述】:

我正在尝试创建一种递归方法来创建菜单。 我要实现的菜单显示孩子们的孩子等等。 我已经调试了代码,它一直到“最小的孩子”。

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>

【问题讨论】:

  • 我想你忘了问一个问题。但是我怀疑这与您丢弃对GetMenu(new Node(item.Id))的回复有关
  • 对不起@MongZhu,这是我在这里的第一篇文章,所以我重写了几次,以使其更好。显然,事情并不顺利。无论如何,乔恩已经解决了,还是谢谢! :)
  • @PatrikJansson 别担心。您可以使用帖子下方的edit button 向您的帖子添加信息。它不是刻在石头上的;)幸运的是

标签: c# asp.net recursion


【解决方案1】:

每次调用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-12
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多