2011-10-15 25 views
0

我有一個腳本創建一個JSON對象並將其發送給我的動作控制器。 ActionController接收對象並知道如何將它綁定到ViewModel。動作控制器結束,但AJAX成功回調未被調用?

的動作控制器非常簡單,看起來像這樣:

[HttpPost] 
     public String SaveNumberMatrix(NumberViewModel model) { 
      return "Finished"; 
     } 

的AJAX功能:

function saveNumberMatrix(object, actioncontroller) { 

    var finished = false; 

    $.ajax({ 
    url: actioncontroller, 
    type: 'POST', 
    data: JSON.stringify(object), 
    dataType: 'json', 
    processData: false, 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data); 
     finished = true; 
     }, 
    }); 
    alert(finished); 
    return finished; 
} 

我以前我調試的動作控制器,以及JavaScript警報結束(假)步入

"return "Finished"; 

成功回調從不稱爲 我在哪裏做錯了?

回答

3

AJAX的重點在於它是異步的,意味着您只能在成功回調中處理結果。 $.ajax方法向服務器啓動一個AJAX請求,並立即返回。在這個階段,完成的值仍然是錯誤的,你將離開函數。很久以後,當AJAX完成時,成功回調被執行。只有在這個回調中你可以使用服務器發送的結果。

使用AJAX時,您不應該以順序和同步的方式組織您的JavaScript代碼。

所以它應該是這樣的:

$.ajax({ 
    url: '/actioncontroller/savenumbermatrix', 
    type: 'POST', 
    data: JSON.stringify(object), 
    dataType: 'json', 
    processData: false, 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     // TODO: only here you can use the results of an AJAX call 
    } 
}); 

此外,我會建議你有你的控制器動作總是返回操作的結果,而不是字符串:

[HttpPost] 
public ActionResult SaveNumberMatrix(NumberViewModel model) { 
    return Json("Finished"); 
} 

與您的代碼的另一個問題是,您指示dataType: 'json'作爲響應,並從服務器返回字符串Finished,這是一個無效的JSON。

+0

是的,但爲什麼我從來沒有達到成功的回調? – Kenci

+0

@Kenci,哦,這是一個完全不同的問題。可能有很多原因。例如,你請求的URL是錯誤的,你得到了404。或者在這個動作中引發了一個異常,你得到了500個。使用FireBug來查看封面下發生了什麼。FireBug將向您顯示發送給服務器的確切請求以及來自服務器的響應,以便您知道自己做錯了什麼。此外,我會建議你讓你的控制器操作返回ActionResult,而不是字符串。 –

0

由於您沒有發送有效的json,因此您無法獲得成功回調,因此您需要發回json,因爲您的dataType是json。因此它可能會引發錯誤。

從jQuery文檔:

dataTypeString 
Default: Intelligent Guess (xml, json, script, or html) 
The type of data that you're expecting back from the server. 

在你的情況你指定json但顯然不是發回json

+0

你可以使用:return Json(string object) –

0

這似乎是你的Ajax請求不會到達服務器。請使用ajax錯誤功能。

error: function(a,b,c){alert(a+b+c)} 

,並找出問題

0

添加async參數爲假(異步:假,),那麼AJAX方法將被同步調用。