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

使用Url.Action生成URL未匹配{controller}/{action}路由的问题求解

问题原因
  • 属性路由的优先级高于全局约定路由,你在Update动作方法上标注的[Route("{id}")]属于属性路由,该规则没有指定控制器、动作路径段,匹配逻辑为站点根路径后直接拼接id参数。@Url.Action生成链接时会优先匹配该属性路由规则,因此最终生成仅带id的路径。
  • 如果你的BookController类上没有配置控制器级别的[Route]前缀,就会出现你遇到的https://localhost:44345/1这类地址。
解决方案

方案1:补全属性路由的路径段(推荐,保留属性路由的同时符合路径预期)

修改Update方法的路由属性,补全控制器、动作段:

[HttpGet]
[Route("Book/Update/{id}")]
public ActionResult Update(int id) {...}

如果BookController类上已经加了[Route("[controller]")]控制器级路由前缀,可以简化为:

[HttpGet]
[Route("Update/{id}")]
public ActionResult Update(int id) {...}

调整后@Url.Action生成的链接就会符合/Book/Update/{id}的格式。

方案2:移除动作的属性路由,使用全局约定路由

如果你的项目依赖全局配置的{controller=Home}/{action=Index}/{id?}类约定路由,直接删除Update方法上的[Route("{id}")]属性即可,@Url.Action会自动按照约定规则生成符合预期的路径。

方案3:为路由指定名称区分场景

如果需要同时保留短路由和带控制器动作的路径,可以给路由添加名称标识,生成链接时指定对应路由即可:

// 定义路由名称
[HttpGet]
[Route("{id}", Name = "ShortUpdateRoute")]
public ActionResult Update(int id) {...}

需要生成短链接时调用@Url.RouteUrl("ShortUpdateRoute", new { id = Model.Id }),需要生成带控制器动作的链接时指定使用约定路由即可。

内容的提问来源于stack exchange,提问作者georgebreje

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:54:07