2017-06-13 71 views
1

我有一些代碼使用jQuery的$.ajax()AJAX和數據格式故障

我發現我必須通過JSON.stringify()傳遞我的數據。

$.ajax({ 
    url: '/Resource/ReportError', 
    type: 'POST', 
    data: JSON.stringify({ 
     ResourceId: popup.data('id'), 
     Reason: reason, 
     Description: $('#report-error-description').val(), 
     Email: $('#report-error-email').val() 
    }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     // ... 
    }, 
    error: function() { 
     // ... 
    } 
}); 

到目前爲止,這麼好。但現在我用它來獲取一些數據,只傳入一個ID。所以我想我應該使用GET來代替。

$.ajax({ 
    url: '/Resource/GetInitialReviewData', 
    type: 'GET', 
    data: JSON.stringify({ resourceId: resourceId }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     // ... 
    }, 
    error: function() { 
     // ... 
    } 
}); 

但這種失敗對服務器上的resourceIdnull錯誤。

如果我刪除電話JSON.stringify(),那麼它的工作原理!

data: { resourceId: resourceId }, 

任何人都可以用容易理解的方式解釋這個嗎?爲什麼我需要JSON.stringify用於POST但不適用於GET

+2

你不需要'JSON.stringify()'的一個url如果你的模型的屬性是簡單的類型(但你需要刪除'contentType:'application/json; charset = utf-8','。')並添加'contentType:'application/json; charset = utf-8' '在GET中毫無意義(它沒有任何內容) –

+0

@StephenMuecke:這是'contentType'在這裏搞砸了我嗎?希望看到你對這個評論有更多的評論成爲答案。 –

+0

我需要考慮如何做到這一點,而不寫一本小書的章節 –

回答

1

儘管可以(但通常不必使用手動生成的複雜類型或數組與c#點和索引器表示法不匹配),您不需要使用JSON.stringify()作爲POST。 $.ajax()方法的默認contentType'application/x-www-form-urlencoded; charset=UTF-8',它基本上像一個成功的表單控件名稱/值對的巨大查詢字符串。要看看它會是什麼樣子,你可以使用console.log($('form').serialize());

如果您省略contentType,則可以使用該對象而不對其進行字符串化。

$.ajax({ 
    url: '/Resource/ReportError', 
    type: 'POST', 
    data: { 
     ResourceId: popup.data('id'), 
     Reason: reason, 
     Description: $('#report-error-description').val(), 
     Email: $('#report-error-email').val() 
    }, 
    success: function (data) { 

DefaultModelBinder將然後使用FormValueProvider讀取和數據綁定到你的方法參數。

當您使用JSON.stringify()其轉換你的對象到JSON格式的文本 - 包含名稱/值對(注意周圍的結果值引號)一個巨大的字符串,你可以通過在你的方法單一string參數收到此並自行對其進行反序列化。通過添加contentType: 'application/json; charset=utf-8'DefaultModelBinder現在將使用JsonValueProviderFactory來讀取字符串,並將其反序列化(使用JavaScriptSerializer)並將數據綁定到您的方法參數。

在GET的情況下,沒有主體,並且contentType選項不適用(它將被忽略),因爲DefaultModelBinder將僅讀取查詢字符串(或路由值)中的值。正如maddockst的答覆指出,通過在$.ajax() GET調用使用JSON.stringify(),你產生的

.../Resource/GetInitialReviewData{"resourceId":"someValue"} 

,而不是需要

.../Resource/GetInitialReviewData?resourceId=someValue 
3

type: 'GET'結合使用時,data屬性會將指定的值轉換爲查詢字符串並將其附加到URL。調用JSON.stringify

http://www.test.com?name=Tom 

如果傳遞一個字符串,字符串將被追加到URL,這樣所產生的URL會:所以,如果你叫URL http://www.test.com數據{name: 'Tom'},你最終用下面的網址是:

http://www.test.com{"name":"tom"} 

當您使用datatype: 'POST'data在請求的主體發送。請求的正文需要是一個字符串,這是調用JSON.stringify的原因。

+0

最後一段是不正確的。默認的'contentType'是''application/x-www-form-urlencoded; charset = UTF-8''(名稱/值對的集合) –

+0

@StephenMuecke謝謝,我已經刪除了它。 – maddockst