RedirectToRoute导致重定向循环

Cas*_*roy 8 c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

public ActionResult Logout()
{
    FormsAuthentication.SignOut();
    return RedirectToRoute("Home");
}
Run Code Online (Sandbox Code Playgroud)

我希望此操作可以将用户重定向到主页,但会发生重定向循环(根据Chrome).

上述操作属于"admin"区域中的控制器,因为默认区域定义了"Home"路由 - 我怀疑这是相关的.

以下是衡量标准的途径:

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

更新

return用以下内容替换该语句将导致操作按预期工作:

return RedirectToRoute("Home", (RouteTable.Routes["Home"] as Route).Defaults);
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ich 5

此问题特别针对呼叫RedirectToRoute(string)和您的特定路线:

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

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

controller = "Posts", action = "Index"
Run Code Online (Sandbox Code Playgroud)

但是,RedirectToRoute与所有重定向方法一样,它是控制器的一部分,并尽可能使用当前的Controller和Action作为默认值.这是ASP.NET MVC框架的"特性" - 重用路由来创建新路由.这种方法很有价值,因为您当前的Controller和Action对您的意图有很强的暗示.

一个很好的例子就是RedirectToAction(string)假设你当前实例化的Controller是默认的.

与此对比:

return RedirectToRoute("Home", (RouteTable.Routes["Home"] as Route).Defaults);
Run Code Online (Sandbox Code Playgroud)

而不是指导框架,使用它是关于如何填充暧昧外卡的路线最好的猜测,你有特别指示使用框架默认RouteTable对"家"的路线构建路线,并返回它作为一个RouteObject.