2010-02-05 60 views
21

現在我的ajax帖子都會觸發錯誤事件,即使該操作沒有導致錯誤。我有一個ASP.NET MVC的動作,看起來像:如何從ASP.NET MVC動作返回以允許jQuery ajax成功事件觸發?

[AcceptVerbs(HttpVerbs.Post)] 
public virtual ActionResult StuffToDo(int id) 
{ 
    // do various things that work ... 
    return new JsonResult(); // i have to return something, so this... 
} 

在客戶端我有這樣的jQuery:

$('#actionClick').click(function() { 
    if (confirm('Are you sure?')) { 
     $.ajax({ 
      type: "POST", 
      url: "/Customer/StuffToDo/<%= Model.Customer.Id %>", 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      success: function() { 
       ShowSuccessResult("Yay!"); 
      }, 
      error: function(xhr, ajaxOptions, thrownError) { 
       ShowErrorResult("Boo! Message:" + xhr.responseText); 
      } 
     }); 
     } 
     return false; 
}); 

如果操作成功(沒有拋出異常),那麼我會期待成功事件處理程序被觸發。相反,錯誤事件正在發射。有什麼我應該回傳或改變的行動,所以成功事件觸發?

我意識到這個問題基本上和this other question一樣,但是我的錯誤處理程序已經有了解決其他人問題的擴展簽名。

編輯 每要求,這裏是我得到的迴應:

Link to the screen shot(不知道如何表現出來的問題)

編輯 我改變了將值返回Null以查看是否影響任何內容,但不影響行爲。

編輯 它開始看起來像這與HTTPS的問題。我從請求中獲得多個回覆。前兩個是401消息,然後我得到一個200.

+0

什麼是在HTTP響應? – Pointy 2010-02-05 16:37:49

+0

可以發佈控制檯 – Cherian 2010-02-05 16:41:06

+0

的firebug請求響應的屏幕截圖xhr.responseText是什麼? – 2010-02-05 16:42:44

回答

36

我相信問題是你沒有在JsonResult中返回任何東西。嘗試:

return this.Json(string.Empty); 

並看看是否有效。我覺得現在的問題是,你沒有返回jQuery的調用,而不是一個空的JSON集:

{} 
+0

JsonResult不接受任何參數。我將返回值更改爲空值,但不影響結果。 – 2010-02-05 16:56:32

+0

@Sailing柔道 - 我把那個綁定並修正了代碼示例。 Controller公開一個Json()方法,該方法接受一個對象並返回一個JsonResult對象。 – 48klocs 2010-02-05 17:15:07

+0

這是問題所在!我會在一百萬年內預料到這一點。很好的解決。 – 2010-02-05 19:35:27

17

返回一個空的結果也可能是有用

return new EmptyResult(); 

注:您的返回類型不需要成爲ActionResult或事件的任何東西從它繼承。事實上,mvc會讓你調用任何公共方法。然而,你應該總是使用你想要的最明確的返回類型,就像任何其他方法(如JsonResult)。

-3

你方法的返回類型應該是JsonResult而不是ActionResult。

+8

JsonResult是一個ActionResult。 – msfanboy 2012-05-22 21:12:22

8

2快速筆記的人登陸這裏掙扎着從一個MVC控制器觸發Ajax的jQuery success回調:

  1. 如果你在你的Ajax使用type: "GET",你需要包括JsonRequestBehavior.AllowGet繞過默認抗JSON Hijacking security measures

return Json(true, JsonRequestBehavior.AllowGet); 
  • 如上所述,如果您在Ajax請求中指示了dataType: 'json',如果您正在進行單向呼叫(例如, Save)你不需要返回任何東西,你可以從控制器返回任何可序列化的東西,如Json。但有了200,必須返回一些東西。如果沒有數據返回,請使用204。
  • 錯誤 - 觸發阿賈克斯error處理器!

    // Nope - Status 200 must have some content 
    return new HttpStatusCodeResult(HttpStatusCode.OK); 
    
    // Also returns a 200 with no data - not allowed 
    return new EmptyResult(); 
    

    工程 - 觸發阿賈克斯成功處理程序:

    // Return a 204 if there's no data 
    return new HttpStatusCodeResult(HttpStatusCode.NoContent); 
    
    // Return something with a 200 return 
    return Json(new {Success = true}); 
    
    +1

    這是我的問題。我正在做一個GET並忘記了AllowGet,所以返回實際上是拋出一個異常,所以我的JavaScript處理失敗。 – chrismay 2015-04-02 19:44:35