我有类别表,请参阅其设计:
我想在下拉列表中显示这个嵌套类别,如下图所示:
有人可以帮我找到解决方案吗?
答案 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)