3

我有一个使用 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。

这个问题的原因是什么?

4

3 回答 3

8

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

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

它以前在您的登录操作中保存在服务器端,作为使用 AuthorizeAttribute 的结果调用,ReturnUrl 在查询字符串中传递:

public ActionResult Login(string returnUrl)
{
    ViewBag.ReturnUrl = returnUrl;
    return View();
}
于 2012-11-21T18:47:23.533 回答
3

不确定您的视图是什么样的,但如果您有类似的东西:

@using (Html.BeginForm())
{
}

...那么returnUrl应该有一个填充值,如果它来自另一个 url。

在我的场景中,它始终为空,我假设它可能与您的操作方式相同。我有这样的:

@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现在有一个我可以使用的值。

于 2014-03-18T10:29:03.597 回答
0

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

因为我们使用 ajax 请求提交表单,所以不显眼的 ajax 使用

$("form").serialize();

对于这种形式,在这种情况下(使用 ajax)ReturnUrl(和任何其他参数)不发送到服务器,仅将表单输入元素发送到服务器,因此 MVC Auto ModelBinding 不绑定 ReturnUrl,我们必须在这种状态下使用 @Jaroslaw Waliszko 解决方案。

连载

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

于 2013-05-03T18:05:40.063 回答