C# 将所有父项递归地放入列表中

C# 将所有父项递归地放入列表中,c#,asp.net-mvc,entity-framework,razor,C#,Asp.net Mvc,Entity Framework,Razor,我有一个Category对象(使用EF获取),它有一个导航对象父对象,基本上是另一个类别 这些类别对象一直递归,直到父对象为null 我需要得到的是: <ul> <li>Highest level category (parent=null)</li> <li> <ul> <li>Second highest level category</li>

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

这些类别对象一直递归,直到父对象为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>
}
@model Domain.Category
@{
ViewBag.Recursion=(int)ViewBag.Recursion+1;
}
@如果(Model.Parent!=null)
{
@Html.Partial(“\u RecursiveCategory”,Model.Parent)
    • @ActionLink(Model.Name,“Index”,“Categories”,new{Model.Id,Name=Model.FriendlyName},null)
  • } 其他的 {
  • @ActionLink(Model.Name,“Index”,“Categories”,new{Model.Id,Name=Model.FriendlyName},null)
  • }
    这很明显可以进入第二级,但从那以后,他们都在同一条线上


    那么,有谁能想出一个好办法来解决这个问题呢?同样,如果没有大量的字符串连接,请尝试以下方法:

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

    @模型字符串
    @{
    ViewBag.Recursion=(int)ViewBag.Recursion+1;
    }
    @如果(型号!=null)
    {
    @Html.Partial(“\u RecursiveCategory”,Model.Parent)
    @模型
    }
    其他的
    {
    
  • @ActionLink(Model.Name,“Index”,“Categories”,new{Model.Id,Name=Model.FriendlyName},null)
  • }
    您可能需要调整已创建的ul/li,但以下是
    视图

    @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>
    
    @函数{
    MvcHtmlString CreateTree(MVCAPApplication2.Models.Category)
    {
    var swriter=新的StringWriter();
    var writer=new System.Xml.XmlTextWriter(swriter);
    CreateTree(类别、编写器);
    writer.Close();
    返回新的MvcHtmlString(swriter.ToString());
    }
    void CreateTree(mvcapapplication2.Models.Category,System.Xml.XmlWriter outputWriter)
    {
    如果(category.Parent!=null)
    {
    CreateTree(category.Parent,outputWriter);
    }
    //递归后冒泡
    outputWriter.WriteStarElement(“ul”);
    outputWriter.WriteElementString(“li”,category.Title);
    outputWriter.WriteStarteElement(“li”);
    }  
    }
    @CreateTree(ViewBag.Category)
    
    太棒了!很高兴我能帮忙。
    @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>
    }
    
    @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>