在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)
答案 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对象解释,并且它有你所指出的不同行为。
如果你想要一种获得结果的同类方式,不要强制在响应上使用状态代码,也就是说,将所有内容恢复为正常,并继续像你一样创建消息,最后你是谁坚持您自己的应用程序中的协议,并没有违反任何规则。