ASP.NET MVC登录ReturnUrl总是NULL?

ahe*_*ick 56 asp.net-mvc redirect login

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

dav*_*ere 120

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

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

Html.BeginForm("LogOn", "Account", new { ReturnUrl = Request.QueryString["ReturnUrl"] })
Run Code Online (Sandbox Code Playgroud)

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

  • 如果由于某种原因无法编辑BeginForm(即在整个页面使用单个表单时),还可以在LogOn页面上放置以下隐藏字段:<input type ="hidden"name ="ReturnUrl"value ="@ Request.QueryString ["ReturnUrl"]"/> (8认同)
  • 它认为这在标准的ASP.NET MVC模板上真的打破了.上面的代码正常工作!谢谢戴夫.:) (7认同)
  • 是的 - 它在新的MVC 4模板中被打破了.要重现该错误,只需创建一个新的ASP.NET MVC 4 Web应用程序,并将[Authorize]属性添加到About Action.returnUrl参数将始终为null,除非它被添加为@davewasthere指定. (2认同)
  • 使用混合GET/POST控制器时,@ SimonW的答案对我来说效果更好.在使用POST时,在BeginForm的第3个参数中输入`ReturnUrl`对我来说不起作用. (2认同)

Çağ*_*kin 24

也许你没有将ReturnURL参数包含在登录表单的action属性中,因此发布到没有该参数的URL?

  • @Jon,像这样:<form action ="your-url?ReturnUrl = <%= Request.QueryString ["ReturnUrl"]%>"method ="post"> (5认同)

Ami*_*rzi 7

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

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

using(Html.BeginForm("LogOn", "Account", FormMethod.Post))
{
//form fields
}
Run Code Online (Sandbox Code Playgroud)

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

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

using(Html.BeginForm())
{
//form fields in LogOn View
}
Run Code Online (Sandbox Code Playgroud)

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

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