2013-02-11 38 views
1

我有一个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

您可能需要调整所创建的,但这里的UL /李的年代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> 
+0

正是我需要的! – NeroS 2013-02-12 09:33:43

+0

太棒了!很高兴我能帮上忙。 – 2013-02-12 09:49:05

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