我有一个使用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.
这个问题的原因是什么?
答案 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解决方案这个州。
将一组表单元素编码为字符串以供提交。