1

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

这些 Category 对象不断递归,直到 Parent 为空。

我需要得到什么:

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

这显然可以达到二级,但从那里开始,它们都在同一条线上。

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

4

2 回答 2

0

尝试以下内容:

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>
}
于 2013-02-11T14:19:32.863 回答
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>
于 2013-02-11T16:00:39.997 回答