You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core TagBuilder实现无限级分类菜单部分内容不显示问题求助

解决TagBuilder渲染无限级分类时显示类型名称的问题

我一眼就看出问题出在哪了——你在拼接HTML字符串的时候直接把TagBuilder对象和字符串硬加在一起了!C#里这么做会自动调用对象的ToString()方法,而TagBuilder的默认ToString()返回的就是它的类型全称Microsoft.AspNetCore.Mvc.Rendering.TagBuilder,根本不是你想要的HTML内容。

咱们来一步步修复:

1. 修复后台代码的拼接逻辑

别再直接把TagBuilder和字符串拼接了,改用AppendHtml方法直接传入TagBuilder对象(它实现了IHtmlContent接口,AppendHtml能正确处理它)。同时优化代码结构,让逻辑更清晰:

修改后的Index方法:

public IActionResult Index() 
{ 
    var mainUl = new TagBuilder("ul"); 
    using (SqlDbContext vt = new SqlDbContext()) 
    { 
        // 获取所有顶级分类
        var topCategories = vt.urunKategorileri.Where(i => i.urunKategorileriUstId == 0); 
        foreach (var topCat in topCategories) 
        { 
            // 创建当前分类的li标签
            var liTag = new TagBuilder("li");
            // 添加分类名称的a标签
            liTag.InnerHtml.AppendHtml($"<a href='#'>{topCat.urunKategorileriKategoriAdi}</a>");
            // 获取子分类的ul
            var subMenu = GetSubCategories(topCat.urunKategorileriId);
            // 只有存在子分类时才添加
            if (!string.IsNullOrEmpty(subMenu.InnerHtml.ToString()))
            {
                liTag.InnerHtml.AppendHtml(subMenu);
            }
            // 将li添加到主ul中
            mainUl.InnerHtml.AppendHtml(liTag);
        } 
    } 
    return View(mainUl); 
} 

修改后的子分类方法(顺便改个更易懂的方法名):

private TagBuilder GetSubCategories(int parentId) 
{ 
    var subUl = new TagBuilder("ul"); 
    using (SqlDbContext db = new SqlDbContext()) 
    { 
        // 获取当前父分类下的所有子分类
        var subCategories = db.urunKategorileri.Where(i => i.urunKategorileriUstId == parentId).ToList();
        if (subCategories.Any()) 
        { 
            foreach (var subCat in subCategories) 
            { 
                // 创建子分类的li标签
                var liTag = new TagBuilder("li");
                liTag.InnerHtml.AppendHtml($"<a href='#'>{subCat.urunKategorileriKategoriAdi}</a>");
                // 递归获取下一级子分类
                var subSubMenu = GetSubCategories(subCat.urunKategorileriId);
                if (!string.IsNullOrEmpty(subSubMenu.InnerHtml.ToString()))
                {
                    liTag.InnerHtml.AppendHtml(subSubMenu);
                }
                subUl.InnerHtml.AppendHtml(liTag);
            } 
        } 
    } 
    return subUl; 
}

2. 额外的小优化

  • 把方法名Altkategori改成GetSubCategories,更符合C#命名规范,也更容易理解
  • 用Any()替代Count() > 0,性能更好(Any()找到第一个匹配项就停止遍历,Count()会遍历所有元素)
  • 创建TagBuilder时参数是"ul"而不是"<ul>",这是框架的规范写法(框架会自动添加尖括号)

为什么之前的代码不行?

当你写"<a>...</a>" + Altkategori(id)的时候,C#会把Altkategori返回的TagBuilder对象转换成字符串,而默认的ToString()方法返回的是对象的类型名称,不是渲染后的HTML。通过AppendHtml直接传入TagBuilder,框架会正确调用它的渲染逻辑,输出对应的HTML标签。

你的CSHTML代码@Model是没问题的,它会自动渲染TagBuilder的HTML内容。

内容的提问来源于stack exchange,提问作者maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:53:12