2014-06-11 23 views
1

這裏是我的控制器動作的代碼:jQuery.ajax響應數據不確定

[HttpPost] 
public JsonResult MyAction() 
{ 
    try 
    { 
     // Do something... 

     return Json(new { Success = true }); 
    } 
    catch(Exception ex) 
    { 
     return Json(new { Error = ex.Message }); 
    } 
} 

而且,這裏是我的腳本:

<script> 
    $.ajax({ 
     type: "POST", 
     url: '@Url.Action("MyAction", "MyController")', 
     dataType: 'json' 
    }).done(function (data) { 
     alert(data.Success); 
    } 
    }) 
    .fail(function (data) { 
     alert(data.Error); 
    }); 
</script> 

這部作品的成功(警報顯示正確「真「),但是當動作失敗時,alert(data.Error)顯示Undefined

使用FireBug,我可以看到JSON數據正確返回。爲什麼data.Error「未定義」呢?

UPDATE:

下面是console.log(data)輸出:

readyState 
4 
responseText 
"{"Error":"Attempted to divide by zero."}" 
status 
500 
statusText 
"Internal Server Error" 
abort 
function() 
always 
function() 
complete 
function() 
done 
function() 
error 
function() 
fail 
function() 
getAllResponseHeaders 
function() 
getResponseHeader 
function() 
overrideMimeType 
function() 
pipe 
function() 
progress 
function() 
promise 
function() 
setRequestHeader 
function() 
state 
function() 
statusCode 
function() 
success 
function() 
then 
function() 

更新2:

對不起,有什麼錯我的代碼(不是代碼在這裏,但我運行的代碼)。從console.log(data)輸出正確的是:

Object {Error="Some error."}

+0

設置你相應的語法,你能輸出的JSON數據返回‘時動作失敗’:' console.log(data);' – PeterKA

+0

查看更新。 – ataravati

回答

3

從服務器兩種看法都是成功的JSON響應。就客戶而言,請求沒有任何失敗。試試這個:

$.ajax({ 
    type: "POST", 
    url: '@Url.Action("MyAction", "MyController")', 
    dataType: 'json' 
}).done(function (data) { 
    if (data.Success) { 
     alert('success!'); 
    } else { 
     alert(data.Error); 
    } 
}) 
+0

這不是問題所在。當有異常時,客戶端的'fail'事件觸發。我已經通過在失敗塊內使用'alert'('fail')'來測試它。 – ataravati

+0

在您發佈的代碼中,發現異常。看起來還有另一個異常發生,沒有被處理。你有登錄到調試嗎? –

+0

請參閱我的第二個更新。 – ataravati

0

望着JSON回報,看來,你應該尋找替代data.responseText.Error

alert(data.responseText.Error); 

UPDATE

每更新的輸出,你看爲正確的數據,但在錯誤的回電。當您在服務器端成功handle exceptions時,您避免必須處理會在客戶端出錯服務器相關錯誤。

正如已經指出的那樣,就您的客戶端代碼而言,請求是成功的,因此您應該在完成的回調中查找data.Error。將您的代碼更改爲:

.done(function(data) { 
    !data.Success || alert(data.Success); 
    !data.Error || alert(data.Error); 
}) 
+0

請參閱我的第二個更新。 – ataravati

2

我剛剛面臨類似的問題。 調查開發人員工具中的響應,我發現即使將參數data作爲'undefined'傳遞給'success'函數調用 - 實際響應主體確實包含預期的字符串。

響應進行更深層次的調查在開發工具 - 網絡選項卡 - >按「開始捕捉」 - 與實際的請求記錄 - 點擊「轉到詳細視圖」)。

我這邊的問題畸形的Content-Type的響應頭居住。響應字符串正確傳遞,甚至在其他瀏覽器(FF,Chrome,Safari)中正確解釋。 設置在服務器上的標頭是,在該順序:

Response.AddHeader "Content-type", "text/html;charset=UTF-8" 
    Response.AddHeader "Content-type","application/json" 
    Response.ContentType = "application/json" 

由客戶機接收到的結果(研究了網絡的詳細視圖,像上面提到的)是:

Content-Type text/html;charset=UTF-8,application/json 

似乎IE(8,9)對頭文件很挑剔,特別是Content-Type

這導致在IE9,IE8到參數數據未定義 傳遞和完成後續故障。 只要我除去不想要的標頭,即,該線:

Response.AddHeader "Content-type", "text/html;charset=UTF-8" 

由客戶機接收到的最後conten型僅爲:

Content-Type application/json 

最後,在這部分中的數據參數Ajax調用不再是「不確定」,但預期的「對象」

success: function(data, textStatus, XMLHttpRequest){ 
    alert(typeof(data)); 
}, 

* 在這種情況下,服務器端腳本語言是ASPVBscript的,你應該知道的服務器端頭,才能知道要尋找什麼 *