ASP MVC和JsonResult在出现错误的情况下

本文关键字:错误 情况下 MVC JsonResult ASP | 更新日期: 2023-09-27 18:20:46

在ASP MVC中,我有一个返回json数据的控制器:

public JsonResult Edit(int? id)
{
   if(id==null)
   {
      Response.StatusCode = (int)HttpStatusCode.BadRequest;
      return Json(new { message = "Bad Request" }, JsonRequestBehavior.AllowGet);
   }
   car carTmp = db.car.Find(id);
   if (carTmp == null)
   {
      Response.StatusCode = (int)HttpStatusCode.NotFound;
      return Json(new { message = "Not Found" }, JsonRequestBehavior.AllowGet);
   }
   return Json(carTmp, JsonRequestBehavior.AllowGet);
}

我还有以下ajax请求:

$.getJSON("Edit/" + data, function (result) {
            var car = result;
        })
        .error(function (error) {
            alert(error.message);
        })

如果成功,为什么在结果对象中我有json对象(即:我可以访问result.id、result.name ecc…),但如果出现错误,error.message是未定义的?(我将消息转换为error.responseJson.message)

ASP MVC和JsonResult在出现错误的情况下

您将响应中的状态代码设置为404,以便执行错误回调。

问题是错误回调被定义为function( jqXHR, textStatus, errorThrown ),其中jqxhr将具有responseJSON属性。

您只需要将代码更改为:

$.getJSON("Edit/" + data, function (result) {
    var car = result;
})
.error(function (xhr) {
    alert(xhr.responseJSON.message);
})

问题是,您设置的StatusCode将由浏览器解释,但您通过Ajax请求调用服务器,它将由下层的javascript XMLHttpRequest对象解释,并且它具有您指出的不同行为。

如果你想要一种获得结果的同质方式,不要在响应上强制使用状态码,也就是说,将所有内容都返回为OK,并继续创建消息,最终你会在自己的应用程序中建立协议,并且不会违反任何规则。

当服务器的响应与您预期的不一致时,将执行错误回调。

例如HTTP 404/500错误消息(无效的ajax url)、超时。。。。

在您的情况下,您可以向JSON响应添加额外的参数"success"。

public JsonResult Edit(int? id)
{
   if(id==null)
   {
      return Json(new { success = false, message = "Bad Request" }, JsonRequestBehavior.AllowGet);
   }
   car carTmp = db.car.Find(id);
   if (carTmp == null)
   {
      return Json(new { success = false, message = "Not Found" }, JsonRequestBehavior.AllowGet);
   }
   return Json(new { success = true, data = carTmp }, JsonRequestBehavior.AllowGet);
}

然后在javascript中,您可以像一样处理结果

$.getJSON("Edit/" + data, function (result) {
    if(result.success){
        console.log(result.data);
    } else {
        console.log(result.message);
    }  
})
相关文章: