ReturnUrl QueryString在MVC 4中始终为null

时间:2012-11-21 18:24:46

标签: asp.net-mvc

我有一个使用get方法登录的操作方法:

public virtual ActionResult LogIn()
{
    return View();
}

和Post方法的动作方法,该方法使用Ajax.BeginForm()在Ajax调用中发布,如:

[HttpPost]
[AjaxOnly]
[ValidateAntiForgeryToken]
public virtual ActionResult LogIn(LogInViewModel loginInfo, string returnUrl)
{
   ...
}

但returnUrl总是为空!!!

我使用MVC 4.

这个问题的原因是什么?

3 个答案:

答案 0 :(得分:8)

您必须将returnUrl发送回服务器。例如,您的登录表单应将returnUrl作为参数:

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
    ....
    <input type="submit" value="Log in" />
}

以前在登录操作中保存在服务器端,由于在查询字符串中传递了ReturnUrl而使用AuthorizeAttribute而调用:

public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

答案 1 :(得分:2)

不确定您的观点是什么样的,但如果您有类似的内容:

@using (Html.BeginForm())
{
}

...然后returnUrl应该有一个填充值,如果它来自另一个网址。

在我的场景中,它总是为空,我假设它可能与你做到的方式相同。我有这样的话:

@using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { role = "form" }))
{
}

我所做的就是改变它看起来像这样:

@using (Html.BeginForm("LogOn", "Account", new { returnUrl = Request.QueryString["ReturnUrl"] }, FormMethod.Post, new { role = "form" }))
{
}

returnUrl现在有一个我可以使用的值。

答案 2 :(得分:0)

继续完成@Jaroslaw Waliszko的好答案,导致这个问题的原因是:

因为我们使用ajax请求提交表单,不引人注意的ajax使用

$("form").serialize();

这个表单,在这种情况下(使用ajax)ReturnUrl(和任何其他参数)不发送到服务器,只有表单输入元素发送到服务器,所以MVC Auto ModelBinding不绑定ReturnUrl,我们必须使用@Jaroslaw Waliszko解决方案这个州。

serialize

  

将一组表单元素编码为字符串以供提交。