ASP.NET Core 5路由配置id默认值始终返回0如何解决
问题原因
- 路由注册顺序错误:ASP.NET Core 路由系统按照注册顺序从上到下匹配,先注册的路由优先级更高。你将通用默认路由放在了自定义路由前面,你访问的
https://localhost:xxx/podcast/seccion/historias会优先匹配到默认路由规则:路径片段会被解析为controller=podcast、action=Seccion、id=historias,由于historias是字符串无法转换为int类型,参数绑定失败后id就会取int类型的默认值0,你写的自定义historias路由全程没有被触发。 - 自定义路由规则不匹配访问路径:你定义的historias路由匹配规则是
seccion/{id=300},只能匹配路径前缀为/seccion/的请求,完全匹配不到你实际访问的/podcast/seccion/前缀的路径。
解决方法
根据你的需求,提供两种常用实现方案:
方案1:调整常规路由配置
- 把自定义路由挪到默认路由前面,保证优先级更高
- 修正自定义路由的匹配规则,适配你实际的访问路径
如果你要实现访问/podcast/seccion/historias时id固定为300,修改路由配置如下:
app.UseEndpoints(endpoints => { // 自定义路由放前面,优先级更高 endpoints.MapControllerRoute( name: "historias", pattern: "podcast/seccion/historias", defaults: new { controller = "Podcast", action = "Seccion", id = 300 }); // 通用默认路由放最后 endpoints.MapControllerRoute( name: "default", pattern: "{controller=podcast}/{action=Index}/{id?}"); });
如果你要实现访问/podcast/seccion不带id参数时,id默认赋值300,修改自定义路由如下:
endpoints.MapControllerRoute( name: "seccionDefault", pattern: "podcast/seccion/{id=300}", defaults: new { controller = "Podcast", action = "Seccion" });
小提示:如果你的设计是
/seccion路径不需要带/podcast前缀,那只需要调整路由顺序,直接访问https://localhost:xxx/seccion就可以拿到默认id=300的参数。
方案2:使用属性路由更直观
你也可以直接在Action上加路由属性,避免路由顺序和匹配规则出错,无需修改Startup的路由注册代码:
// 匹配/podcast/seccion/historias路径,id默认值300 [Route("podcast/seccion/historias")] public IActionResult Seccion(int id = 300) { return View(); }
如果需要支持带动态id参数的访问,可以改成:
// 匹配/podcast/seccion/xxx路径,不带id时默认值300 [Route("podcast/seccion/{id=300}")] public IActionResult Seccion(int id) { return View(); }
内容的提问来源于stack exchange,提问作者Daniel Lazarte
相关产品推荐
相关产品推荐

