为什么RedirectToRoute("Default")不会重定向到根目录?

Mic*_*out 2 c# asp.net-mvc asp.net-mvc-routing

鉴于这些路线:

routes.MapRoute("Test", "test", new { controller = "Test", action = "Index" });
routes.MapRoute("Default", "{controller}/{action}/{id}", 
  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

如果我从TestController的Index操作调用RedirectToRoute("Default")它重定向到/test但我希望它重定向到/

我在调试会话期间返回之前检查了调用RedirectToRoute("Default")的结果.

RedirectToRouteResult result = RedirectToRoute("Default");

它有一个属性RouteName,其值为"Default",属性RouteValues没有元素(Count = 0).我使用Reflector检查,并在内部传递null作为RouteValueDictionary.

同样,我希望给定我的应用程序中定义的路由的默认值,它将重定向到HomeController上的Index视图.

为什么不重定向/

Cha*_*hao 6

填充到当前操作的RouteValueDictionary用于填充Controller,Action,ID.这通常是您想要的功能,让您<%:Html.ActionLink("MyAction")%>无需在视图中指定控制器即可执行操作.

要强制它完全退回默认,只需使用:

RedirectToRoute("default", null");

第二个参数用于您的路由值,并通过指定它来覆盖预先存在的值.

但是我会说首选的方法是拥有一个不带任何参数的Home路线.这意味着您的重定向不需要浮动周围的空值加载,并且调用RedirectToRoute("Home")也很好且明确.

编辑

这是一个非常古老的答案,正如一些人提到的似乎并没有为他们工作.为了它的价值我现在不使用这种模式,并在需要突破时明确覆盖控制器和区域.它不仅显然更好地工作,而且当你回到代码时,很明显地看到你已经走出这个环境并且意味着消除某些路由值.

为了记录,我还倾向于基于基于约定的生成基于命名路由的URL生成.


Jes*_*ter 5

我不认为 Chao 提到的“空”参数对我有用。也许它在以前的 MVC 版本中是这样的,但现在在 MVC 5.2 中,这是我让它工作的唯一方法:

RedirectToRoute("Default", new { controller = "", action = "" });
Run Code Online (Sandbox Code Playgroud)