2015-11-06 55 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); 
     }) 

爲什麼,在以下情況下成功,在結果對象中,我有json對象(即:我可以訪問result.id,result.name ecc ...)但在出錯的情況下,error.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你只把成功回調 – 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對象解釋,並且它具有您指出的不同行爲。

如果您希望獲得結果的同類方式,請不要強制響應中的狀態碼,即將所有內容都返回爲OK,並隨時繼續創建消息,最終確定誰是穩定的在你自己的應用程序中的協議,你沒有違反任何規則。