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

时间:2010-10-20 14:50:20

标签: 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 }
);

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

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

RedirectToRouteResult result = RedirectToRoute(“Default”);

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

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

为什么不重定向到/

3 个答案:

答案 0 :(得分:6)

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

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

RedirectToRoute("default", null");

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

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

修改

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

对于记录,我更倾向于基于约定生成的基于命名路由的URL生成。

答案 1 :(得分:3)

我不认为Chao提及的“null”参数曾经为我工作过。也许它在以前的MVC版本中做过,但现在在MVC 5.2中,这是我能够让它工作的唯一方法:

RedirectToRoute("Default", new { controller = "", action = "" });

答案 2 :(得分:2)

如果没有查看实际代码以查看发生了什么,知道原因可能有点棘手,但这个forum帖子确实有所启发。回答说,它可能会创建一个RouteValueDictionary,其中包含您当前所处的控制器和操作,在您的情况下,它将是Test的控制器和Index的操作。然后,当您调用RedirectToRoute("Default")时,将在匹配默认路由时使用控制器和RouteValueDictionary中的操作,您将进入Test控制器中的Index操作。

现在,您可以随时Redirect("/")转到您网站的主页。