控制器操作方法返回字符串或使用ajax发布请求重定向到另一个操作

时间:2018-07-27 22:00:17

标签: javascript jquery asp.net-mvc

我通过jquery ajax发布调用MVC操作方法。该操作方法将返回一个字符串值,或者如果操作方法中的某些条件为true,则它将重定向到另一个操作方法。问题是,每当我尝试重定向到另一个动作方法时,ajax帖子都会执行错误块,并且每当动作方法返回字符串值时,它就可以正常工作。我不想使用html表单发布。下面是我的代码:

 function VerifyCreds() {
    $.ajax({
        type: "POST",
        url: "/Login/Verify",
        data: '{Username: "' + $("#txtUsername").val() + '",Password: "' + $("#txtPassword").val() + '" }',
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            alert(response);
        },
        failure: function (response) {
            alert(response.responseText);
        },
        error: function (response) {
            alert(response.responseText);
        }
    });
}

public ActionResult Verify(string Username, string Password)
    {
        string Response = "0";
        EmployeeEntities ent = new EmployeeEntities();
        var val = ent.VerifyUser(Username, Password);
        Response = val.FirstOrDefault().ToString();
        if (Response == "1")
        {
            return this.RedirectToAction("LandingPage");
        }
        return Content(Response);
    }
    public ActionResult LandingPage()
    {
        return View();
    }

1 个答案:

答案 0 :(得分:0)

您正在明确指定json作为数据类型。这意味着,您的ajax方法期望来自服务器的响应为json字符串。 jQuery ajax方法将使用JSON.parse方法从此json字符串创建JavaScript对象,并将其传递给回调。当您从服务器进行重定向时,它不会返回200 OK响应,而是返回302重定向响应,浏览器通常会重新调用响应的位置标头值。由于服务器返回的字符串无法使用JSON.parse安全地转换为JavaScript对象,因此您将获得ajax方法的错误回调。 (我的猜测是对LandingPage调用的响应!。检查“网络”标签以查看即将到来的响应)

如果您绝对想处理这种情况,则最好在两种情况下都返回正确的JSON结构,并在客户端检查此JSON数据并根据需要进行重定向。

我还建议您使用适当的类型。使用int而不是将数字存储在string变量中。

public ActionResult Verify(string Username, string Password)
{       
    var ent = new EmployeeEntities();
    var val = ent.VerifyUser(Username, Password);
    var response = val.FirstOrDefault();
    if (response == 1)
    {
       return Json(new { status="redirect", url = Url.Action("LandingPage")});      
    }
    return Json(new { status="success", message = "Valid login" });
}

在ajax调用成功的情况下,检查此json数据并基于status属性,进行重定向或向用户显示消息。

success: function (response) {
            if(response.status==="redirect")
            {
                window.location.href = response.url;
            }
            else
            {
                alert(response.message);
            }
        },

您也可以从ajax调用中完全删除dataType: "json",。 jQuery将根据响应标头智能地猜测类型并使用它。由于我们从操作方法中显式返回Json,因此响应的Content-Type标头值为application/json