ASP.NET MVC登录ReturnUrl总是NULL?

时间:2009-05-06 03:24:36

标签: asp.net-mvc redirect login

在ASP.NET MVC中使用Forms身份验证时,尝试重新登录到站点时,会在查询字符串中放入ReturnUrl参数。我的登录操作方法接受“returnUrl”字符串。但是,似乎returnUrl字符串始终为null,即使它明显位于查询字符串中。有关为什么会出现这种情况或可能的解决方案的任何想法?

5 个答案:

答案 0 :(得分:119)

当您使用一个通用登录表单时会发生这种情况,但您明确指定了Controller和ActionMethod(导致表单发布,但丢失了查询字符串)

只是为了澄清,这是你的代码在BeginForm中的样子:

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })
  

编辑这是设计为Rick并在下面的评论中提及。但是,它不允许UI模式在网站深处,单击LogOn,然后返回到之前的页面,如果它允许匿名用户。这是一种常见的模式。 Logon的LogOff方法也可以很好地用于LogOn的干净重定向。

答案 1 :(得分:23)

也许您没有将ReturnURL参数包含在登录表单的操作属性中,从而发布到没有该参数的URL?

答案 2 :(得分:7)

基本上,Asp.net MVC有一些隐藏的功能。例如,当您将变量'id'传递给控制器​​操作时,它会将'id'解释为默认标识符并将其放在浏览器查询中,并使用前斜杠。使用其他名称而不是'id',我们将看到'?'而不是前刀。因为在 global.asax 文件上的RegisterRoutes方法上设置了'id'名称。

在此问题中,您已使用以下代码为控制器创建了自定义数据传递程序:

using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}

所以Asp.net MVC忽略了传递给控制器​​动作的其他有用数据,我们会returnUrl总是null

然而,通过使用它,Asp.net MVC正确行动并且returnUrl已经安装:

using(Html.BeginForm())
{
//form fields in LogOn View
}

顺便说一下,当我们将自定义数据传递器用于控制器操作时,必须像这样传递另一个手动数据:

using(Html.BeginForm("LogOn", "Account", new {ReturnUrl = Request.QueryString["ReturnUrl"] }))
{
//form fields
}

答案 3 :(得分:3)

我可以通过两种方式来处理登录和注销方案。 戴夫啤酒概述了一种方式,上面。 还有另一种方法适用于许多情况。我在编写NerdDinner教程时使用过它。本教程为我们提供了一个注销功能,可以将您注销并带您回家。我不想那样。我想在退出之前返回我所在的页面。所以我修改了我的帐户控制器注销操作,看起来像这样

   public ActionResult LogOff()
    {
        FormsService.SignOut();
        return Redirect(Request.UrlReferrer.ToString());
    }

您可以获得更高级的功能并传入returnUrl并对其进行测试,以防您想要覆盖此行为。但我不需要那个。这实现了期望的结果。登录可以类似地工作。也许有方法可以使用MVC框架为我做这个,但在我学习之前,这非常简单且可靠。

答案 4 :(得分:1)

尝试以下方法:

        public static MvcForm BeginForm(this HtmlHelper htmlHelper, string id)
    {
        string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;

        TagBuilder tagBuilder = new TagBuilder("form");

        tagBuilder.MergeAttribute("id", id);
        tagBuilder.MergeAttribute("action", formAction);
        tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(FormMethod.Post), true);

        HttpResponseBase httpResponse = htmlHelper.ViewContext.HttpContext.Response;
        httpResponse.Write(tagBuilder.ToString(TagRenderMode.StartTag));

        return new MvcForm(htmlHelper.ViewContext.HttpContext.Response);
    }

首先确保您已在web.config中设置登录网址,接下来,确保您的登录表单不包含任何类似操作,例如:

查看:

如果指定操作,则返回URL将始终为null:

控制器:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SignIn(string userName, string password, bool? rememberMe, string returnUrl)
{
}