我通过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();
}
答案 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