ASP.NET MVC成员:谁应该为LogOn方法提供“returnUrl”?

时间:2010-09-03 09:35:01

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

以下是LogOn后期操作方法的定义

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

好吧,就像我有时一样,我回答我自己的问题,以便在让其他人回答之后添加更多关于我如何解决问题的信息(在这种情况下,Darin Dimitrov)。

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

以下是一些问题:

  1. 智能感知器无法识别``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"]
    } 
    

    但是我收到了一些错误:“无法找到资源”,网址显示http://example.com/Account/myController/myAction。该帐户仍在Url中,导致同样的错误。

  4. 最后,我在开头添加了另一个斜杠,然后才有效。

    new
    {
        returnUrl = "/" + Page.RouteData.Values["controller"] + "/" + Page.RouteData.Values["action"]
    } 
    
  5. 了解重定向业务的许多方面看起来很重要。到目前为止,我主要使用RedirectToAction()

    谢谢@Darin Dimitrov。

答案 2 :(得分:0)

尝试将以下内容放在提供LogOn的视图中

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