ASP MVC和JsonResult在出错的情况下

时间:2015-11-06 10:43:23

标签: c# asp.net .net ajax asp.net-mvc

在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)

3 个答案:

答案 0 :(得分:1)

您正在将响应中的状态代码设置为404,因此应执行错误回调。

问题是error callback定义为function( jqXHR, textStatus, errorThrown ),其中jqxhr将具有responseJSON属性。

您只需将代码更改为:

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

答案 1 :(得分:0)

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

e.g。 HTTP 404/500错误消息(无效的ajax url),超时....

在您的情况下,您可以添加其他参数'成功'致JSON回应。

+--------------------------------------------+
|             category_table                 |
+----+--------------------+------------------+
+----+--------------------+------------------+
| id | cat_title          | parent           |
+----+--------------------+------------------+
|  1 | cat1               | 0                |
|  2 | cat2               | 1                |
|  3 | cat3               | 1                |
|  4 | cat4               | 2                |
|  5 | cat5               | 2                |
|  6 | cat6               | 2                |
+----+--------------------+------------------+


+---------------------------------------------------------------+
|                       content_table                           |
+----+--------------------+-------------------------------------+
+----+--------------------+------------------+------------------+
| id | title              | category         | content          |
+----+--------------------+------------------+------------------+
|  1 | title1             | 1                | test1            |
|  2 | title2             | 1                | test2            |
|  3 | title3             | 2                | test3            |
|  4 | title4             | 3                | test4            |
|  5 | title5             | 1                | test5            |
|  6 | title6             | 3                | test6            |
|  7 | title7             | 4                | test7            |
|  8 | title8             | 5                | test8            |
|  9 | title9             | 5                | test9            |
| 10 | title10            | 4                | test10           |
| 11 | title11            | 6                | test11           |
+----+--------------------+------------------+------------------+

然后在javascript中你可以处理你的结果,如

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);
}

答案 2 :(得分:0)

问题是你正在设置要由浏览器解释的StatusCode,但你是通过Ajax请求调用服务器,它将由较低层中的javascript XMLHttpRequest对象解释,并且它有你所指出的不同行为。

如果你想要一种获得结果的同类方式,不要强制在响应上使用状态代码,也就是说,将所有内容恢复为正常,并继续像你一样创建消息,最后你是谁坚持您自己的应用程序中的协议,并没有违反任何规则。