ASP.NET Core 6 MVC分页列产品时遇HTTP 404错误求助
解决ASP.NET Core 6 MVC中/products页面404错误
问题根源
当前路由配置存在匹配优先级问题:
pages路由的{slug?}模式会优先捕获/products请求,将其当作页面slug尝试调用PagesController.Page方法,但不存在对应页面,导致404。- 现有
products-category路由仅匹配带分类slug的/products/{categorySlug}路径,未覆盖/products的直接访问场景。
解决方案
提供两种可行修复方式,任选其一即可:
方式1:添加约定路由
在Program.cs的路由配置中,在products-category路由前新增匹配/products的路由规则:
app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( "pages", "{slug?}", defaults: new { controller = "Pages", action = "Page" } ); // 新增路由:匹配/products路径,指向Products.Index endpoints.MapControllerRoute( "products-index", "products", defaults: new { controller = "Products", action = "Index" } ); endpoints.MapControllerRoute( "products-category", "products/{categorySlug}", defaults: new { controller = "Products", action = "ProductsByCategory" } ); endpoints.MapControllerRoute( name: "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}" ); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); });
方式2:使用属性路由(推荐)
直接在ProductsController的方法上添加路由属性,无需修改Program.cs的约定路由:
public class ProductsController : Controller { private readonly FlowerShopContext context; public ProductsController(FlowerShopContext context) { this.context = context; } // 用属性路由绑定/products路径 [Route("products")] public async Task<IActionResult> Index(int p = 1) { // 原方法逻辑不变 } // 用属性路由绑定/products/{categorySlug}路径 [Route("products/{categorySlug}")] public async Task<IActionResult> ProductsByCategory(string categorySlug, int p = 1) { // 原方法逻辑不变 } }
验证
修改完成后重启项目,访问https://localhost:7179/products即可正常加载所有产品页面。
内容的提问来源于stack exchange,提问作者Đuro Jovičić
相关产品推荐
相关产品推荐

