【问题标题】:ASP.NET MVC Membership: Who should provide "returnUrl" to the LogOn method?ASP.NET MVC 成员资格:谁应该向 LogOn 方法提供“returnUrl”?
【发布时间】:2010-09-03 09:35:00
【问题描述】:

这是 LogOn 后操作方法的定义

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
  // more inside
}

我有一个基本问题。框架是否提供string returnUrl?还是我有这个责任?

感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc asp.net-membership


    【解决方案1】:

    这取决于谁在调用这个方法,以及这个参数是否在 POST 请求中提供。例如,如果用户尝试访问带有[Autorize] 属性的控制器操作并且他未通过身份验证,则框架将自动重定向到LogOn 操作(呈现表单的操作,而不是带有[HttpPost] 的操作)并提供returnUrl 参数。然后,您可以在登录表单中有一个隐藏字段来保留其值,以便当用户输入他的凭据并将表单提交给LogOn 操作时,如果登录成功,他会被重定向到最初请求的页面。

    【讨论】:

    • 我明白了。因此,仅当重定向到 LogOn 是强制用户提供凭据的结果时,框架才提供 returnUrl。当用户只需单击 ActionLink 以自愿登录时怎么样?我应该添加新的 { returnUrl = "whatever_action_displayed_the_View" } 吗?
    • 是的,正确,如果用户直接点击LogOn 链接,将不提供returnUrl。您可以通过new { returnUrl = "whatever_action_displayed_the_View" } 或简单地在LogOn 操作中提供它,检查是否定义了returnUrl,如果登录成功则重定向到默认操作。
    • 最后一件事。任何操作都可以显示视图。那么如何从视图中获取显示视图的操作呢?新 { returnUrl = }
    • RouteData阅读它:new { returnUrl = RouteData.Values["action"] }
    • 谢谢@Darin:我花了更多时间让它工作,因为我正在努力处理 Redirect() 操作结果。
    【解决方案2】:

    嗯,就像我有时所做的那样,我回答自己的问题是为了添加更多信息,说明我在得到其他人回答后如何解决问题(在这种情况下,是 Darin Dimitrov)。

    简而言之,@Darin Dimitrov 向我解释说,如果重定向到 LogOn 操作方法不是强制用户提供凭据的结果(当方法尝试访问时被修饰),我需要提供 returnUrl带有[Authorize] 属性)。我需要使用new { returnUrl = RouteData.Values["action"] } 来提供该值。

    这里有一些问题:

    1. Intellisense 无法识别 ``RouteData.Values["action"],我需要使用 Page.RouteData.Values["action"]

    2. 我不断收到以下错误:“找不到资源”,网址显示 http://example.com/Account/Whatever_action_is_in_the_returnUrl。这是有道理的,因为我只提供了操作字符串。

    3. 我做到了

      new
      {
          returnUrl = Page.RouteData.Values["controller"] + "/" + Page.RouteData.Values["action"]
      } 
      

      但是我得到了一些错误:“找不到资源”,url显示http://example.com/Account/myController/myAction。该帐户仍在 URL 中,导致同样的错误。

    4. 最后,我在开头添加了另一个斜线,然后它起作用了。

      new
      {
          returnUrl = "/" + Page.RouteData.Values["controller"] + "/" + Page.RouteData.Values["action"]
      } 
      

    看起来了解重定向业务的许多方面很重要。到目前为止,我主要使用RedirectToAction()

    感谢@Darin Dimitrov。

    【讨论】:

    • 在处理 url 时总是使用 helpers:new { returnUrl = Url.Action(Page.RouteData.Values["action"], Page.RouteData.Values["controller"]) },它更简洁,并且避免了你对你的 url 进行硬编码。我也不明白Page. 和 Intellisense 是怎么回事。你不需要这个参数。 System.Web.Mvc.ViewPage 已经有一个名为 RouteData 的属性,所以您所要做的就是 <%= this.RouteData.Values["xxx"] %>。 VS Intellisense 无法识别某事这一事实并不意味着这件事有问题。
    • @Darin Dimitrov:我只是在品尝我的发现。我并不是要在真实场景中使用“/”。但是,正如我所说,我相信对我和其他新来者来说,阅读有关重定向业务的信息很重要,因为它们有很多面孔。例如,您只需使用 Url.Action()。到目前为止,我使用了 RedirectToAction,它对我来说效果很好。再次感谢。
    【解决方案3】:

    尝试将以下内容放入提供登录的视图中

    @using (Html.BeginForm("index", "signin", new { ReturnUrl = Request.QueryString["ReturnUrl"] }))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多