RedirectToRoute导致重定向循环

本文关键字:循环 重定向 RedirectToRoute | 更新日期: 2023-09-27 18:15:00

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    return RedirectToRoute("Home");
}

我希望这个动作将用户重定向到主页,但相反,重定向循环发生(根据Chrome)。

上述动作属于"admin"区域中的控制器,其中"Home"路由是为默认区域定义的——我怀疑这是相关的。

这是一条很好的路线:

routes.MapRoute(
    "Home",
    "{controller}/{action}/{slug}",
    new { controller = "Posts", action = "Index", slug = UrlParameter.Optional },
    new[] { "GoBlog.Controllers" }
);

return语句替换为以下语句将使操作按预期工作:

return RedirectToRoute("Home", (RouteTable.Routes["Home"] as Route).Defaults);

我想知道为什么会这样。理想情况下,我可以省略(麻烦的)第二个参数。

RedirectToRoute导致重定向循环

这个问题是RedirectToRoute(string)呼叫和您的特定路由所特有的:

routes.MapRoute(
    "Home",
    "{controller}/{action}/{slug}",
    new { controller = "Posts", action = "Index", slug = UrlParameter.Optional },
    new[] { "GoBlog.Controllers" }
);

您所期望的是RedirectToRoute将用路由定义的默认值填充{controller}/{action}/的任意路由定义:

controller = "Posts", action = "Index"
RedirectToRoute像所有的重定向方法,是你的控制器的一部分,并使用你的当前控制器和动作作为默认值在任何可能的地方。这是ASP的一个"特性"。. NET MVC框架——重用路由来创建新的路由。这种方法很有价值,因为你当前的控制器和动作是你意图的强烈暗示。

一个很好的例子是RedirectToAction(string),它假设你当前实例化的控制器是默认的。

对比
return RedirectToRoute("Home", (RouteTable.Routes["Home"] as Route).Defaults);

没有指示框架使用它对如何填充模糊通配符路由的最佳猜测,而是特别指示框架使用DefaultsRouteTable为"Home"路由构造一个路由并将其作为RouteObject返回。

当你调用RedirectToRoute(string)

该方法使用RouteCollection将routeName中传递的路由名转换为URL。GetVirtualPath方法。

where pass null作为参数RouteValueDictionary。在本例中,参数从当前RequestContext获取值为控制器,动作等等,也就是说,你得到这样的url

"{controller}/{action}/{slug}"
"Login/Logout/"

和重定向循环。

当你调用

return RedirectToRoute("Home", (RouteTable.Routes["Home"] as Route).Defaults);

代替RedirectToRoute(string)使用RedirectToRoute(string, RouteValueDictionary)和RouteCollection。

在MVC中允许你的控制器尽可能多的控制是一个通用的最佳实践。您可以使用多种控制器方法,通常应该使用最适合您正在执行的过程的方法。

  • return View()。告诉控制器生成并返回指定的HTML,类似于Server.Transfer()

  • 用于将HTML与action匹配,或者在传递静态HTML时对URL字符串不感兴趣。
  • Return RedirectToAction()。告诉控制器基于Action构建一个新的URL字符串。这将为Action解析路由字典,并处理默认值。它充当Response.Redirect(),并将返回一个新生成的URL。一般来说,这是最常用的重定向。这样做的好处是,即使路由字典发生了变化,也不会改变。

  • return RedirectToRoute()。类似于RedirectToAction(),但是绑定到路由字典。这将使用传入的任何路由参数,在路由字典中搜索精确的路由匹配。它不查找Actions,因此不会构建路由或注入默认值。

  • 当需要处理具有特定非缺省值的精确路由时使用。
  • return Redirect()。此重定向需要一个完整的URL,并将重定向到新URL。通常用于重定向到完全不同域的URL