Asp.Net Core MVC路由问题:将/posts/1路由到PostsController的Index方法
嘿,我来帮你搞定这个路由匹配的问题!
TL;DR
你只需要给PostsController的Index方法配置属性路由,或者调整全局路由模板,让/posts/1能正确映射到Index(int? id)方法,其中属性路由更适合大规模系统的路由管理。
详细解决方案
推荐方案:属性路由(适合大规模系统,路由更易维护)
直接在你的Index方法(或者控制器类上)添加路由属性,就能同时匹配/posts和/posts/1两种URL:
写法1:方法上直接指定完整路由
public class PostsController : Controller { // 同时匹配 /posts(id为null)和 /posts/1(id=1) [Route("posts/{id?}")] public IActionResult Index(int? id) { // 你的业务逻辑代码 return View(); } }
写法2:控制器+方法的组合路由(更简洁)
如果给控制器类加上路由前缀,方法上的路由可以简化:
// 给控制器设置统一的路由前缀"posts" [Route("posts")] public class PostsController : Controller { // 匹配 /posts 和 /posts/1 [Route("{id?}")] public IActionResult Index(int? id) { return View(); } }
这种方式的优势在于,每个控制器的路由规则都集中在类和方法上,大规模系统里不会出现全局路由混乱的问题,每个模块的路由自己管理,清晰明了。
备选方案:全局路由配置(不推荐大规模系统)
如果不想用属性路由,也可以在全局路由里添加一个优先级更高的规则,确保/posts/xxx优先映射到PostsController.Index:
// 在Program.cs(或老版本的Startup.cs)里配置 app.MapControllerRoute( name: "posts_route", pattern: "posts/{id?}", defaults: new { controller = "Posts", action = "Index" }); // 保留原来的默认路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
不过这种方式在系统变大后,全局路由会越来越多,后期维护成本高,所以还是更推荐属性路由。
为什么原来的/posts能访问,但/posts/1不行?
因为默认的全局路由规则是{controller=Home}/{action=Index}/{id?},当你访问/posts时,系统会自动把action默认设为Index,所以能匹配到PostsController.Index();但访问/posts/1时,系统会把1当成action名称去寻找PostsController.1()方法,显然这个方法不存在,所以就会出现路由失败的情况。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

