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);
我想知道为什么会这样。理想情况下,我可以省略(繁琐的)第二个参数。
答案 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)
此方法使用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时使用。