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

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}占位符
  • 你指定的Index action会覆盖路由的默认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:31