使用父/子表的分层面包屑

时间:2013-03-22 08:25:21

标签: asp.net-mvc asp.net-mvc-3 entity-framework code-first

我正在尝试构建一个诊断工具,因此您从列表中选择一个项目,它会显示另一个列表,您选择另一个列表,依此类推 - 因此诊断问题可以根据需要深入隐藏,例如:

选择:

Software - Microsoft - Outlook - How do I?
                               - Errors 
                     - Word    - How do I?
                               - Errors
                     - Excel   - How do I?
                               - Errors

         -Lotus 

Hardware -PC
         -Laptop 

Network  -Firewall

这些将在表格中定义为:

id  parent_id Title
1   0         Software
2   0         Hardware
3   0         Network
4   1         Microsoft
5   1         Lotus
6   4         Outlook
7   4         Word
8   4         Excel
9   5         How do I?
10  5         Errors
...etc

我已经看到了对MVCSiteMap的引用 - 我以类似的方式使用了webforms站点地图 - 但这需要是动态的,因此面包屑显示链接:

Software > Microsoft > Excel > How do I? > Freeze panes

我的桌面模型是:

public class Forum
{
    public int id { get; set; }
    public int parent_id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

我的控制器中的代码是:

     var bc = db.Fora.FirstOrDefault(i => i.id == id);
        var cbh = new List<Forum>();
        if (bc != null)
        {
            var parent = bc.parent_id;
            while (parent != null)
            {
                cbh.Insert(0, parent);
                parent = parent.Parent;
            }
        }

我要做的是建立一个新的论坛列表,然后我可以列出并从中生成面包屑。我陷入困境的地方是:

 cbh.Insert(0, parent);
 parent = parent.Parent;

我怀疑我的控制器代码在这两行中是错误的,或者我的论坛模型需要从 parent_id id 的引用来创建层次结构。

有人可以帮我完成这个难题的最后一部分吗?

谢谢,

标记

1 个答案:

答案 0 :(得分:1)

在您的代码cbh是类型论坛的通用列表,但是parent如果是int类型,当您cbh.Insert(0, parent);时会出现类型错误,您应该做的更像是这样:

var bc = db.Fora.FirstOrDefault(i => i.id == id);
var cbh = new List<Forum>(); 
while (bc != null) 
{
    cbh.Insert(0, bc);
    bc = db.Fora.FirstOrDefault(i => i.id == bc.parent_id);
}
祝你好运。