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