无限制的嵌套类别

时间:2014-03-26 09:48:58

标签: asp.net-mvc entity-framework asp.net-mvc-4

我有类别表,请参阅其设计:

我想在下拉列表中显示这个嵌套类别,如下图所示:

有人可以帮我找到解决方案吗?

1 个答案:

答案 0 :(得分:3)

您应检索所有类别,按ParentId排序,然后按名称检索,如果需要。您应该在控制器中执行此操作,或者更好地通过与存储库或EntityFramework Datacontext对话的服务层执行此操作。您没有指定数据访问策略。

然后在您的控制器中,您将必须迭代所有类别并创建考虑父关系的每个项目。例如,如果您遍历“顶级类别”,则可以添加当前类别的所有子类别。如果你有超过1级的嵌套,你将不得不使用递归。

这里直接写的伪代码,可能不会按原样编译:

//Assume you want to produce a SelectList to use in your View, let's use a view model like the following
public class CategoryViewModelItem
{
   public string Value {get;set;}
   public string Text {get;set;}
}

在您的控制器/服务层:

List<CategoryViewModelItem> items = new List<CategoryViewModelItem>();

//get all of them from DB
List<Category> allCategories = dataContext.Categories.ToList();
//get parent categories
List<Category> parentCategories = allCategories.Where(c => c.ParentId == null)
   .OrderBy(c => c.Title);

foreach(var cat in parentCategories)
{
    //add the parent category to the item list
    items.Add(new CategoryViewModelItem { Value = cat.Id, Text = cat.Title });
    //now get all its children (separate function in case you need recursion)
    GetSubTree(allCategories, cat, items);
}

private void GetSubTree(IList<Category> allCats, Category parent, IList<CategoryViewModelItem> items)
{
    var subCats = allCats.Where(c => c.ParentId == parentId);
    foreach(var cat in subCats)
    {
        //add this category
        items.Add(new CategoryViewModelItem { Value = cat.Id, Text = parent.Title + " >> " + cat.Title });
        //recursive call in case your have a hierarchy more than 1 level deep
        GetSubTree(allCats, cat, items);
    }
}

然后,为了呈现您的SelectList,您可以将SelectList作为您的模型(或其一部分)发送给您的视图:

//in your controller's action
SelectList select = new SelectList(items, "Value", "Text");
return View(select);

并在你的视图中使用它:

@Html.DropDownList("Categories", @Model)