【问题标题】:ASP.Net MVC - redirecting to route gives Redirect LoopASP.Net MVC - 重定向到路由提供重定向循环
【发布时间】:2010-09-19 06:34:51
【问题描述】:

这可能是那些简单的问题之一。我试图在用户成功通过身份验证后重定向用户,或者将他们返回到登录页面。但是成功页面在不同的路线上,我无法让重定向工作..

这是我在 Globals.asax 中的路线:

routes.MapRoute( _
    "Default", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Login", .action = "Index", .id = ""} _
    )
routes.MapRoute( _
    "Stuff", _
    "{controller}/{action}/{id}", _
    New With {.controller = "Stuff", .action = "Index", .id = ""} _
    )

我有 2 个控制器:LoginController.vbStuffController.vbViews/Login/Index.aspx 文件包含一个带有代码的简单表单:

<form method="post" action="/Login/Authenticate">

LoginController 包含以下代码:

Function Authenticate() As RedirectToRouteResult
    ' authentication code commented out  ;o)

    Return RedirectToRoute("Stuff")
End Function

StuffController 包含以下内容:

Function Index()
    ' show stuff..

    Return View()    ' return /Views/Stuff/Index.aspx
End Function

这是我迄今为止尝试过的:

  • 函数 Authenticate()
  • 函数 Authenticate() As ActionResult()
  • 函数 Authenticate() As RedirectToRouteResult()

所有这些都会导致浏览器中的重定向循环超时。我错过了什么?!

【问题讨论】:

  • 好问题,我也遇到了同样的问题!

标签: asp.net-mvc url-redirection


【解决方案1】:

正确答案很好,但是:

  • 如果您想将控制器/动作名称从 Staff/Index 更改为其他名称怎么办?

-那么您不仅需要更改 global.asax 中的值,还需要更改您使用该技术的所有地方的值。

我的建议:

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

现在,在这种情况下,您不会传递相应的 Stuff/Index 控制器/动作的名称。这将让您轻松管理更改。

【讨论】:

    【解决方案2】:

    会不会是你的 Stuff 路由和默认路由的格式一模一样,所以当你调用时

    Return RedirectToRoute("Stuff");
    

    生成的 url 具有以下形式:{controller}/{action}/{id},例如再次登录/验证,因为您在登录控制器的验证操作中。

    尝试

    RedirectToAction("Index", "Stuff");
    

    希望对您有所帮助。

    【讨论】:

    • 你是对的。我删除了“东西”路线,并使用了 RedirectToAction("[View]", "[Controller]") 并且它有效 - 感谢您的帮助 :o)
    • 哦,我还需要将 Authenticate 函数的返回类型更改为“ActionResult” :o)
    【解决方案3】:

    我看不到您在哪里设置身份验证 cookie 或以任何方式将用户标记为已通过身份验证。是在你省略的代码中吗?

    【讨论】:

    • 是的,我可能错了,但我认为我不需要任何身份验证代码,因为我在这里真正想要做的只是“跳转”控制器 - 从 LoginController 到 StuffController
    • 如果你没有设置授权。 cookie,如果您的操作方法用 [Authorize] 属性修饰,那么您将再次被重定向回您的登录 url。
    • 感谢您提供有关 [Authorize] 属性的说明。事实是,当我试图让这个工作时,我没有编写授权代码,所以我没有用 [Authorize] 装饰任何操作方法 - 我只是让“流程”正确开始:o)
    【解决方案4】:

    试试

    routes.MapRoute( _    
    "Stuff", _
    "",_  
    New With {.controller = "Stuff", .action = "Index", .id = ""} _    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多