C# 将所有父项递归地放入列表中
我有一个Category对象(使用EF获取),它有一个导航对象父对象,基本上是另一个类别 这些类别对象一直递归,直到父对象为null 我需要得到的是: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>
<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>