我有一个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>
}
这显然对第二级很好,但从那时开始,它们都在同一条线上。
那么,有人能想出一个很好的解决方案来解决这个问题吗?再一次,没有大量的字符串连接?
答案 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>