ASP.NET Core MVC中无需额外变量加载文章关联多对多标签
解决方案
当然可以,而且你原代码里的var Tag语句完全多余,纯纯浪费数据库性能,直接删掉就行。核心是在获取指定ID的文章时,同时加载它关联的标签数据,给你两种靠谱的实现方式:
方法一:修改仓储的GetByIdAsync方法(推荐)
如果你的_postInterface仓储可以修改,直接把关联数据的加载逻辑整合到GetByIdAsync里,这样后续所有调用这个方法的地方都能拿到带标签的文章:
// 仓储实现类里的GetByIdAsync修改成这样 public async Task<Post> GetByIdAsync(int id) { return await _context.Posts .Include(p => p.PostTags) // 加载文章和标签的中间表 .ThenInclude(pt => pt.Tag) // 再加载中间表关联的标签实体 .FirstOrDefaultAsync(p => p.Id == id); }
控制器代码不用改,直接用原来的var Post = await _postInterface.GetByIdAsync(id);就行,此时返回的Post已经包含关联的标签数据了。
方法二:直接在控制器里查询(不修改仓储的话用这个)
如果不想动仓储接口,直接跳过仓储,用_context查询单个带标签的文章:
public async Task<IActionResult> Detail(int id) { var post = await _context.Posts .Include(p => p.PostTags) .ThenInclude(pt => pt.Tag) .FirstOrDefaultAsync(p => p.Id == id); if (post == null) { return NotFound(); // 记得处理文章不存在的情况 } return View(post); }
不管用哪种方法,之后你在视图里就能直接遍历Model.PostTags来展示对应的标签信息了,比如:
@foreach (var postTag in Model.PostTags) { <span>@postTag.Tag.Name</span> }
内容的提问来源于stack exchange,提问作者ZNAXNOR
相关产品推荐
相关产品推荐

