You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:调整常规路由配置

  1. 把自定义路由挪到默认路由前面,保证优先级更高
  2. 修正自定义路由的匹配规则,适配你实际的访问路径
    如果你要实现访问/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:42:01