.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
相关产品推荐
相关产品推荐

