ASP.NET MVC使用AJAX防止动作重定向

时间:2017-04-26 21:15:27

标签: jquery asp.net ajax asp.net-mvc asp.net-mvc-4

我的_Layout.cshtml部分视图中有一个AJAX函数,该帖子被发布到SignIn()的所有视图使用。如果登录失败,则应该重定向到SignInFailed()并返回视图。相反,在返回视图后,它将重定向回原始视图。

我没有收到任何会阻止它留在SignInFailed()的例外或错误。

这是我的AJAX:

$.ajax({
           type: "POST",
           traditional: true,
           url: "@Url.Action("SignIn", "Home")",
           data: { user: name, password: code, pageName: urlPage },
                   success: function () {
                       ///do stuff
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        if (debug) {
                            alert(XMLHttpRequest.responseText);
                            alert(textStatus);
                            alert(errorThrown);
                        }
                    }
});

为什么在没有指令的情况下重定向回原始视图,我该怎么做才能防止这种行为?

1 个答案:

答案 0 :(得分:1)

正如Stephen Muecke在我的问题评论中所说,AJAX旨在发布和获取数据而无需刷新或重定向页面;因此,为什么我以前的方法不起作用。我没有尝试在后端重定向,而是从后端返回JSON,让前端知道登录是否成功。然后,根据结果,我使用JavaScript重定向或刷新。

我更改了SignIn()操作以返回JSON:

public ActionResult SignIn(string user, string password)
{
    //Some database stuff validating username and password
    if (loginSuccessful)
    {
        return Json(new { status = "success" });
    }
    else
    {
        return Json(new { status = "failure", redirectUrl = "/Home/SignInFailed" });
    }

}

我将我的AJAX改为:

$.ajax({
           type: "POST",
           traditional: true,
           url: "@Url.Action("SignIn", "Home")",
           data: { user: name, password: code },
                   success: function (result) {

                       if (result.status == "success") {
                           location.reload();
                       }
                       else {
                           location.href = result.redirectUrl;
                       }
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        if (debug) {
                            alert(XMLHttpRequest.responseText);
                            alert(textStatus);
                            alert(errorThrown);
                        }
                    }
});