ASP.NET MVC中RedirectToAction为何生成含路由模板字面量的URL?
问题原因分析:为什么
RedirectToAction会生成带"Games"的URL? 我来帮你拆解一下这个问题的核心逻辑:
1. 原路由的硬编码字面量导致匹配优先级问题
你注册的第一条路由是优先被路由系统匹配的(路由按注册顺序从上到下检查,先匹配到就用它生成URL),它的模板里有个硬编码的字面量Games,同时默认指定了area = "Games":
routes.MapRoute( name: "games", template: "Games/{controller}/{*tags}", defaults: new { area = "Games", action = "Index" });
当你调用RedirectToAction(nameof(HomeController.Index), "Home")时,没有明确传入area参数,路由系统会尝试用这条优先级最高的路由来生成URL:
- 模板里的
Games是固定字符串,会直接被拼到URL开头 - 你传入的
Home控制器会填充到{controller}占位符 - 你指定的
Indexaction会覆盖路由的默认action值
这就导致最终生成的URL是Games/Home/Index,也就是你看到的https://localhost/Games/Home。
2. 修改路由模板后解决问题的原因
你把第一条路由的模板改成了"{area}/{controller}/{*tags}",去掉了硬编码的Games,换成了{area}占位符:
routes.MapRoute( name: "games", template: "{area}/{controller}/{*tags}", defaults: new {action = "Index" });
这时候,当你调用RedirectToAction没有指定area时,这条路由因为缺少area的值(没有设置默认area),无法完成匹配。路由系统就会继续往下检查第二条默认路由:
routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}");
这条路由的默认控制器是Home、默认action是Index,刚好和你调用RedirectToAction的参数完全匹配,所以会生成根路径的URL(Home/Index会被路由系统简化为/)。
补充:如何正确生成Games区域的URL
如果之后你需要针对Games区域的控制器生成URL,只需要在RedirectToAction中明确指定area参数即可:
RedirectToAction("Index", "GameList", new { area = "Games" });
这样就能匹配修改后的第一条路由,生成Games/GameList/Index的正确URL。
内容的提问来源于stack exchange,提问作者user4084148
相关产品推荐
相关产品推荐

