使用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
相关产品推荐
相关产品推荐

