2015-11-06 3 views
2

В ASP MVC У меня есть контроллер, который возвращает JSON данные:ASP MVC и JsonResult в случае ошибки

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

Почему, в случае успех, в объекте result у меня есть объект json (т. е. я могу получить доступ к result.id, result.name ecc ...), но в случае ошибки ошибка.message не определена? (У меня есть сообщение в error.responseJson.message)

+0

потому что результат приближается, я имею в виду, в случае null вы возвращаете сообщение об ошибке, но это тоже будет в случае успеха. Вы можете проверить его один раз, отправив null в модель –

ответ

0

Обратный вызов ошибки будет выполнен, когда ответ с сервера не будет тем, что вы ожидали.

например. Сообщение об ошибке HTTP 404/500 (неверный адрес ajax), тайм-аут ...

В вашем случае вы можете добавить дополнительный параметр «успех» в ответ JSON.

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

Я думаю, что добавление Response.StatusCode = (int) HttpStatusCode.NotFound ajax не выполняет обратный вызов успеха, а ошибку .... В вашем javascript вы поместили только success callback – Tom

+0

Вы можете удалить Response.StatusCode = (int) HttpStatusCode.NotFound, а затем обработать свой ответ при успешном обратном вызове –

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

Проблема заключается в том, что вы устанавливаете которым StatusCode должен интерпретироваться браузером, но вы вызываете сервер через Ajax запрос , который будет интерпретироваться объектом javascript XMLHttpRequest в нижних слоях, и он имеет различное поведение, которое вы указали.

Если вы хотите, чтобы однородный способ получения результатов не форсировал код состояния в ответе, то есть возвращал все как ОК, и продолжайте создавать сообщения так же, как и вы, в конце концов, вы, кто стабилен протоколы в вашем собственном приложении, и вы не нарушаете никаких правил.

Смежные вопросы