2014-12-02 46 views
1

我有一個項目在MVC4與C#。在這個項目中,我的控制器中的一個有一個方法來通過一個Ajax函數被調用:

[HttpPost] 
public string EditPackage(int id, string newPkgName) 
{ 
    try{ 
     //do logic here 
     return "OK"; 
    }catch(Exception exc){ 
     return "An error occurred, please try later! " + exc.Message; 
    } 
} 

此方法由以下Ajax函數調用,使用jQuery:

$.ajax({ 
    url: $(this).data('url'), 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    traditional: true, 
    data: JSON.stringify({ id: id, newPkgName: newPkgName}), 
    success: function() { 
     location.reload(true); 
     successNotification("Package edited successfuly!"); 
    }, 
    error: function (message) { 
     errorNotification(message); 
    } 
}); 

與此問題代碼,即使服務器返回catch中的返回"An error occurred, please try later! " + exc.Message;消息,成功函數是始終調用的函數。

爲了語言,無論我做什麼,我都不會運行錯誤函數。

爲了解決這個問題我查了一下官方文檔:

然而,由於我failry新來這個我不明白任何參數,也不知道怎樣去使用它們有效。

如何使用Ajax,jQuery和我的控制器創建包含所有可能信息的良好錯誤消息?

+0

你可以嘗試拋出而不是返回 – 2014-12-02 10:05:05

+0

錯誤func調用如果響應狀態不正常(200),但如果你在服務器上捕獲異常,那麼你返回的狀態OK(200)的響應,所以,簡單的不抓住異常 – Grundy 2014-12-02 10:06:33

回答

4

$.ajax呼叫的error部分僅在返回的狀態碼不是200 OK以外的任何其他情況下觸發。在你的情況下,你正在返回一個明文響應,因此將是200。你可以改變這種行爲是這樣的:

try { 
    // do logic here 
    return "OK"; 
} 
catch (Exception exc) { 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request"); 
} 
error: function (jqXHR, textStatus, errorThrown) { 
    errorNotification(textStatus); 
} 

任何適合您的需求,您可以更改HttpStatusCode來。

或者,你可以保持200響應,並用標誌返回JSON指示請求是否是成功的:

[HttpPost] 
public ActionResult EditPackage(int id, string newPkgName) 
{ 
    try { 
     //do logic here 
     return Json(new { Success = true, Message = "OK"}); 
    } 
    catch (Exception exc) { 
     return Json(new { Success = false, Message = "An error occurred, please try later! " + exc.Message }); 
    } 
} 

然後你就可以刪除error處理,並檢查標誌的狀態你success處理程序:

success: function(response) { 
    if (response.Success) { 
     location.reload(true); 
     successNotification("Package edited successfuly!"); 
    } 
    else { 
     errorNotification(response.Message); 
    } 
}, 
+0

如果我使用第一種方法,我需要在Ajax函數中進行哪些更改? – 2014-12-02 10:21:45

+0

您無需對其進行任何更改。 – 2014-12-02 10:22:08

+0

要正確顯示信息,我的錯誤函數需要是'error:function(jqXHR,textStatus,errorThrown)'。如果您將此添加到您的回覆中,我會很樂意接受它:D – 2014-12-02 10:39:23

1

我這樣做,它可能不是最好的方法,但它的工作原理爲我嘗試做。

[HttpPost] 
public ActionResult EditPackage(int id, string newPkgName) 
{ 
    try{ 
     //do logic here 
     return Json(new {Success = true, Message = "OK"}); 
    }catch(Exception exc){ 
     return Json(new {Success = false, Message = "An error occurred, please try later! " + exc.Message}); 
    } 
} 

然後我阿賈克斯如下所示:

$.ajax({ 
    url: $(this).data('url'), 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    traditional: true, 
    data: JSON.stringify({ id: id, newPkgName: newPkgName}), 
    success: function (data) { 
     if(data.Success) 
     { 
      location.reload(true); 
      successNotification("Package edited successfuly!"); 
     } 
     else 
     { 
      errorNotification(data.Message); 
     } 
    }, 
    error: function (message) { 
     errorNotification(message); 
    } 
}); 

我這樣做,這樣你的標準誤差從服務器捕獲HTTP錯誤,但它意味着你可以通過一個成功或失敗回一種更有用的方法。這也意味着,如果您的更新由於驗證原因而失敗或者您可以很好地將該消息傳回。

+0

僅供參考用於創建匿名對象的語法不正確。 – 2014-12-02 10:11:48

+0

所以是的,我會糾正它,對不起在打字的同時被告知。 – Pheonyx 2014-12-02 10:12:29