当我开始使用AJAX调用时,不会发生RedirectToAction

时间:2015-06-09 13:51:45

标签: asp.net ajax asp.net-mvc asp.net-mvc-3 asp.net-mvc-5

使用ajax调用时,

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">
}

1 个答案:

答案 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,因为如果你这样做并且存在内部错误;除了登录浏览器控制台

之外什么都不会发生