RedirectToAction
“无效”,为什么会这样?
“登录”操作将我发送到带有RedirectToAction的操作索引,因此我可以看到该视图已返回。 AJAX调用最终在done
。
为什么URL没有像我期望的那样变成../home/index?
如果我在done
手动调用window.location.href = "/WebConsole53";
,我将获得我想要的重定向,但我宁愿在服务器上使用重定向。有人能弄清楚问题是什么吗?感谢。
Ajax电话:
$('#btnLogin').on('click', function() {
var url = urlHelper.getUrl('Account/login');
var data = {
username: $('#inputLoginUsername').val(),
password: $('#inputLoginPassword').val()
}
$.ajax({
url: url,
method: "POST",
data: data
})
.done(function (html) {
console.log('done login');
//window.location.href = "/mySite"; // this works
})
.fail(function (jqXhr, textStatus, errorThrown) {
console.log('failed');
});
});
动作:
[HttpPost]
[AllowAnonymous]
//[ValidateAntiForgeryToken]
public ActionResult Login(string username, string password/*, LoginViewModel model*/, string returnUrl)
{
//if (!ModelState.IsValid)
//{
// return View(model);
//}
// This doesn't count login failures towards account lockout To enable password failures to trigger account lockout, change to shouldLockout: true
//var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
//switch (result)
//{
// case SignInStatus.Success:
// return RedirectToLocal(returnUrl);
// case SignInStatus.LockedOut:
// return View("Lockout");
// case SignInStatus.RequiresVerification:
// return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
// case SignInStatus.Failure:
// default:
// ModelState.AddModelError("", "Invalid login attempt.");
// return View(model);
//}
return RedirectToAction("Index", "Home");
//return RedirectToActionPermanent("Index", "Home");
//return RedirectToLocal(returnUrl);
//return RedirectToAction("ShowDashboard", "Dashboard");
}
主页索引:
public ActionResult Index()
{
return View();
// return RedirectToAction("Login", "Account");
// return RedirectToAction("ShowDashboard", "Dashboard");
}
解决方案 - 完全归功于@Stephen Muecke
使用html.helper提交的表单,请参阅文档here
@using (Html.BeginForm("login", "Account"))
{
@Html.TextBox("Name");
@Html.Password("Password");
<input type="submit" value="Sign In">
}
答案 0 :(得分:0)
根据评论;这不是最好的做法。但是,要回答您的问题,重定向不会发生,因为浏览器没有直接处理响应。您在成功方法中处理响应。
如果要根据服务器规定的AJAX调用重定向,可以使用以下内容:
$.ajax({
url: url,
method: "POST",
data: data,
success: function (data) {
$("body").html(data); //Providing the result is a response to redirect ONLY
}
})
实际上,您只是使用响应覆盖整个身体,然后浏览器会在实际呈现任何内容之前将其作为重定向。
但是,如果你采用这种方法,你可能想要满足其他状态代码,显然是500,因为如果你这样做并且存在内部错误;除了登录浏览器控制台
之外什么都不会发生