.NET Core 8 MVC项目点击分类后产品列表数据为空问题
问题排查与修复方案
核心问题分析
你的控制器代码存在逻辑错误:当前查询是根据blogPosts.Id等于传入的分类ID来获取文章,这完全不符合需求——我们需要的是获取属于该分类下的所有博客文章,而不是ID等于分类ID的单篇文章。此外,你返回的是单个blogPost对象,但视图接收的是CategoryViewModel,类型不匹配,这直接导致视图中Model.BlogPost没有数据。
分步修复
1. 修正控制器逻辑
修改Category方法,查询分类ID匹配的所有博客文章,并支持分页(适配视图中的分页组件):
[Route("cat/{title}-C{id}")] public async Task<IActionResult> Category(long id, int page = 1) { // 每页显示的文章数量,可按需调整 const int pageSize = 10; // 查询属于当前分类的所有博客文章,包含关联数据 var blogPostsQuery = _db.blogPosts .Where(x => x.CategoryId == id) // 关键:匹配文章的分类ID,而非文章自身ID .Include(x => x.Category) .Include(x => x.Author) .Include(x => x.PostImages) .OrderByDescending(x => x.CreatedDate); // 按创建时间倒序,可选配置 // 分页处理 var pagedBlogPosts = await blogPostsQuery.ToPagedListAsync(page, pageSize); // 构建视图模型,传递分类信息和分页后的文章列表 var viewModel = new CategoryViewModel { Category = await _db.Categories.FirstOrDefaultAsync(c => c.Id == id), BlogPost = pagedBlogPosts }; return View(viewModel); }
2. 修正URL生成代码
你当前使用的BlogSeoUrl生成的是单篇博客的URL,分类页面需要调用CategorySeoUrl生成正确的分类跳转链接:
@Common.Extensions.CategorySeoUrl(Model.Category)
3. 验证视图模型匹配
确保CategoryViewModel的定义包含以下核心属性:
public class CategoryViewModel { public Category Category { get; set; } public IPagedList<BlogPost> BlogPost { get; set; } }
额外检查点
- 确认
BlogPost实体类中存在CategoryId属性,且与Category实体正确建立外键关联。 - 检查数据库中是否有博客文章的
CategoryId与你点击的分类ID匹配的数据。 - 统一路由参数与控制器参数的命名:路由中是
{id},控制器参数建议改为小写id(.NET路由大小写不敏感,但统一命名可避免潜在问题)。
内容的提问来源于stack exchange,提问作者sandox
相关产品推荐
相关产品推荐

