RedirectToRoute导致重定向循环

时间:2014-07-25 05:46:23

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

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);

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

3 个答案:

答案 0 :(得分:5)

此问题特别针对电话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),它假定你当前实例化的Controller是默认值。

与此对比:

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

您没有指示框架使用它最好地猜测如何填充模糊的外卡路由,而是明确指示框架使用 <中的默认值 em> RouteTable for&#34; Home&#34;路由构建路径并将其作为RouteObject返回。

答案 1 :(得分:3)

致电RedirectToRoute(string)

  

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

null 作为参数RouteValueDictionary传递。所以在这种情况下,这个参数来自当前的 RequestContext ,其值为 controller,action 等,即你得到这样的url

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

并获得重定向循环。

致电

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

RedirectToRoute(string)使用RedirectToRoute(String, RouteValueDictionary),而RouteCollection.GetVirtualPath方法则为该路由传递默认值。

答案 2 :(得分:2)

MVC中的一般最佳做法是尽可能多地控制您的控制器。您可以使用多种控制器方法,通常应该使用最适合您正在执行的过程的方法。

  • return View()。告诉控制器生成并返回指定的HTML,类似于Server.Transfer()。用于将HTML与Actions匹配,或者在URL字符串中不感兴趣地提供静态HTML时。

  • Return RedirectToAction()。告诉控制器根据Action构建新的URL字符串。这将解析Action的路由字典,并处理默认值。它充当Response.Redirect(),并将返回新生成的URL。通常,这是最常用的重定向。如果路线词典被更改,这也有不改变的好处。

  • return RedirectToRoute()。与RedirectToAction()类似,但与路线词典相关联。这将使用传递的任何路径参数在路线词典中搜索精确的路线匹配。这不会查找Actions,因此不会构建路由或注入默认值。在必须处理具有特定非默认值的精确路线时使用。

  • return Redirect()。此重定向需要完整的URL,并将重定向到新的URL。通常在重定向到完全不同的域上的URL时使用。