在MVC4中使用递归构建树菜单 - 要使用哪种数据结构?

时间:2013-03-10 03:05:02

标签: c# asp.net-mvc

我正在使用处理Boxes的MVC4构建一个应用程序。一个盒子可以包含许多盒子,可能包含一个盒子。菜单应如下所示:

> Box 1
> Box 2
   > Box 2.A
   > Box 2.B
   > Box 2.C
      > Box 2.C.1
   > Box 2.D
> Box 3

现在我有以下内容:

public object GetTree(Box? box){

   foreach (var box in box.Boxes)
   {
       GetTree(box)
       // append menu item with box.name, box.id pair so a link can get generated
   }

我有点卡住了。菜单将作为对象传递给客户端,客户端将以某种方式将其显示为链接的树状菜单。这里最合适的数据结构是什么?

1 个答案:

答案 0 :(得分:1)

以下是关于递归和适当数据结构的全部内容。

所以这里是关于递归的。你已经开始实现这种方式了,所以这很好。

首先要做的事情。数据结构。要表示树状菜单,您应该像喜欢的对象一样构建树,因此您必须创建它们的简单图形。你开始很好。你有一个Box对象。让我们来加强它。创建一个具有List of Boxes的BoxNode对象,如下所示:

public class BoxNode
{
    public List<Box> BoxChildren 
    {
        get; set;
    }
}

然后Box

public class Box
{
    public string Name
    {
        get; set;
    }

    public BoxNode BoxNode
    {
        get; set;
    }
}

所以现在我们有了基本的数据结构,让我们转到函数:

    public static void CreateMenuTree(BoxNode boxNode, string indent)
    {
        foreach (Box box in boxNode.BoxChildren)
        {
            Console.WriteLine(indent + box.Name);

            if (box.BoxNode != null && box.BoxNode.BoxChildren != null && box.BoxNode.BoxChildren.Count > 0)
            {
                CreateMenuTree(box.BoxNode, indent + indent);
            }
        }
    }  

在这里,我还创建了一个完全可行的代码:Gist code for this question *

请注意,对于MVC场景,你当然用适当的url链接生成替换Console.WriteLine并用某种CSS类缩进。但我想你应该明白这一点。

*请注意,这不是生产代码,而是DEMO代码。