将所有父母递归列表

时间:2013-02-11 13:59:38

标签: c# asp.net-mvc entity-framework razor

我有一个Category对象(用EF获取),它有一个导航对象Parent,基本上是另一个Category。

这些Category对象会一直递归,直到Parent为null。

我需要得到的东西:

<ul>
    <li>Highest level category (parent=null)</li>
    <li>
        <ul>
            <li>Second highest level category</li>
            <ul>
                <li>Local category</li>
            </ul>
        <ul>
    </li>
</ul>

最好没有大量的字符串操作(因为涉及大量的类和其他事情),并且纯粹具有递归视图。现在的问题是,我不知道它应该如何运作。如果我从最高级别类别下来会很容易,但我需要向上(向后)。

我有什么:

@model Domain.Category

@{
    ViewBag.Recursion = (int) ViewBag.Recursion + 1;
}

@if (Model.Parent != null)
{
    @Html.Partial("_RecursiveCategory", Model.Parent)
    <li>
        <ul class="categorylist">
            <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
        </ul>
    </li>
}
else
{
    <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
}

这显然对第二级很好,但从那时开始,它们都在同一条线上。

那么,有人能想出一个很好的解决方案来解决这个问题吗?再一次,没有大量的字符串连接?

2 个答案:

答案 0 :(得分:0)

尝试someThing,如下所示:

private string GenerateUL(IQueryable<Menu> menus)
{
    var sb = new StringBuilder();

    sb.AppendLine("<ul>");
    foreach (var menu in menus)
    {
        if (menu.Menus.Any())
        {
            sb.AppendLine("<li>" + menu.Text);
            sb.Append(GenerateUL(menu.Menus.AsQueryable()));
            sb.AppendLine("</li>");
        } 
        else
            sb.AppendLine("<li>" + menu.Text + "</li>");
        }
    }
    sb.AppendLine("</ul>");

    return sb.ToString();
}

控制器

public ActionResult SomeAction()
{
    return View(GenerateUL(Category.Children));
}

查看

@model string

@{
    ViewBag.Recursion = (int) ViewBag.Recursion + 1;
}

@if (Model != null)
{
    @Html.Partial("_RecursiveCategory", Model.Parent)
    @Model
}
else
{
    <li>@Html.ActionLink(Model.Name, "Index", "Categories", new {Model.Id, name = Model.FriendlyName}, null)</li>
}

答案 1 :(得分:0)

您可能需要调整创建的ul / li,但这里是View

@functions{


MvcHtmlString CreateTree(MvcApplication2.Models.Category  category)
{
    var swriter  = new StringWriter();
    var writer = new System.Xml.XmlTextWriter(swriter);

    CreateTree(category, writer);

    writer.Close();

    return new MvcHtmlString(swriter.ToString());
}

void CreateTree(MvcApplication2.Models.Category  category, System.Xml.XmlWriter outputWriter)
{
    if (category.Parent != null)
    {
        CreateTree(category.Parent, outputWriter);
    }

    // bubble up after recursion
    outputWriter.WriteStartElement("ul");
    outputWriter.WriteElementString("li", category.Title);
    outputWriter.WriteStartElement("li");
}  

}

    <div>

    @CreateTree(ViewBag.Category)


    </div>