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)
我想知道为什么会这样.理想情况下,我可以省略(繁琐的)第二个参数.
此问题特别针对呼叫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.