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(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);
没有指示框架使用它对如何填充模糊通配符路由的最佳猜测,而是特别指示框架使用Defaults从RouteTable为"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