.NET Core 5.0 如何实现不定层级嵌套分类展示?可否不使用Partial View
不定层级分类列表非Partial View实现方案
完全可以不用Partial View实现需求,下面给出3种适配你当前邻接表分类结构的常用实现方案:
你使用的邻接表实体定义是存储不定层级分类的通用方案,结构正确:
public class Categories { public int ID { get; set; } public int ParentCatID { get; set; } public string CategoryName { get; set; } public string Instruction { get; set; } }
方案1:Razor视图内递归渲染(改动最小)
直接在主Razor视图内定义递归委托生成HTML,不需要拆分Partial View,示例代码如下:
@model IEnumerable<Categories> @{ // 定义递归渲染委托 Func<Categories, IHtmlContent> RenderCategoryNode = null; RenderCategoryNode = (currentCat) => { // 查询当前分类的子分类 var childCats = Model.Where(c => c.ParentCatID == currentCat.ID).ToList(); // 生成当前分类li节点 var liTag = new TagBuilder("li"); liTag.InnerHtml.Append(currentCat.CategoryName); // 存在子分类则递归生成子节点ul if (childCats.Any()) { var ulTag = new TagBuilder("ul"); foreach (var child in childCats) { ulTag.InnerHtml.AppendHtml(RenderCategoryNode(child)); } liTag.InnerHtml.AppendHtml(ulTag); } return liTag; }; } <!-- 渲染根分类(根分类ParentCatID默认设为0,可根据你的实际规则调整) --> <ul class="category-tree"> @foreach (var rootCat in Model.Where(c => c.ParentCatID == 0)) { @RenderCategoryNode(rootCat) } </ul>
方案2:后端提前拼装嵌套结构
在Controller层先把平级的Categories列表转换为嵌套视图模型,视图直接遍历嵌套结构即可,不需要写递归逻辑:
- 先定义嵌套视图模型:
public class CategoryViewModel { public int ID { get; set; } public string CategoryName { get; set; } public string Instruction { get; set; } // 子分类集合 public List<CategoryViewModel> Children { get; set; } = new(); }
- Controller中递归拼装嵌套结构后传给视图,视图直接多层遍历即可。
方案3:前端JS递归渲染
后端将全量分类数据以JSON格式返回,前端写递归函数生成DOM插入页面,适合前后端分离架构的项目,渲染性能更高。
注意事项
- 根分类的ParentCatID建议统一设为0或null,方便过滤查询
- 如果分类层级特别深(超过100层),建议加递归深度限制,避免栈溢出
内容的提问来源于stack exchange,提问作者Fatih
相关产品推荐
相关产品推荐

