ASP.NET MVCloginReturnUrl总是NULL?

当尝试login到一个站点时,使用ASP.NET MVC中的Forms Authentication,它会在查询string中放入一个ReturnUrl参数。 我的login操作方法接受一个“returnUrl”string。 但是,似乎returnUrlstring始终为空,即使它明显在查询string中。 任何想法,为什么这可能是这样或可能的修复?

也许你不包括你的login表单的动作属性的ReturnURL参数,从而张贴到一个URL没有这个参数?

当您使用一个通用的login表单时,这往往会发生,但是您明确指定Controller和ActionMethod(这是造成表单发布,但丢失查询string)

只是为了澄清,这是你的代码应该在你的BeginForm中看起来像什么:

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

编辑这是由devise瑞克和下面的评论中提到。 但是,它不允许深入网站的UI模式,单击LogOn,然后返回到您之前所在的页面(如果允许匿名用户)。 这是一个普遍要求的模式。 大卫·艾伦的LogOff方法也可以在LogOn上很好地实现干净的redirect。

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

在这个问题中,您已经使用以下代码创build了自定义数据传递给控制器​​:

 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 } 

有两种方法可以处理login和注销情况。 戴夫·比尔(Dave Beer)在上面简单介绍 还有另一种方法可以在很多情况下使用。 我在编写NerdDinner教程时使用了它。 本教程为我们提供了注销function,可将您注销并带您回家。 我不想要那个。 我想在退出之前返回到我所在的页面。 所以我修改了我的帐户控制器注销操作,看起来像这样

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

你可以获得更多的信息,并通过一个returnUrl来testing它,以防你想重写这个行为。 但是我不需要那个。 这达到了预期的效果。 login可以类似地工作。 也许有办法使用MVC框架为我做这个,但直到我学习它们,这是非常简单,可靠地工作。

尝试以下操作:

  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中设置了loginurl,接下来,确保你的login表单不包含任何类似的动作,例如:

视图:

如果你指定了action,你将总是得到null的返回url:

控制器:

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