我有一些代码使用jQuery' $.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 () {
// ...
}
});
但是这失败了,服务器上resourceId
为null
的错误。
如果我删除了对JSON.stringify()
的通话,那么它就可以了!
data: { resourceId: resourceId },
任何人都可以通过易于理解的方式解释这一点吗?为什么我需要JSON.stringify
POST ,而不是 GET 。
答案 0 :(得分:3)
data
属性与type: 'GET'
一起使用时会将指定的值转换为查询字符串并将其附加到URL。因此,如果您使用数据http://www.test.com
调用网址{name: 'Tom'}
,则最终会得到以下网址:
http://www.test.com?name=Tom
如果你传递一个字符串,该字符串将被附加到URL,因此调用JSON.stringify
时得到的URL将是:
http://www.test.com{"name":"tom"}
当data
与type: 'POST'
一起使用时,data
会在请求正文中发送。请求的主体需要是一个字符串,这是调用JSON.stringify
的原因。
答案 1 :(得分:1)
尽管可以,但您不需要使用JSON.stringify()
进行POST(但除非您手动生成与c#dot和indexer表示法不匹配的复杂类型或数组,否则通常不需要)。 contentType
方法的默认$.ajax()
为'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格式的文本 - 一个包含名称/值对的巨型字符串(注意结果值周围的引号),您可以通过单个{{{ 1}}方法中的参数并自行反序列化。通过添加string
,contentType: 'application/json; charset=utf-8'
现在将使用DefaultModelBinder
来读取字符串,对其进行反序列化(使用JsonValueProviderFactory
)并将数据绑定到方法参数。
在GET的情况下,没有正文,JavaScriptSerializer
选项不适用(它将被忽略),因为contentType
只会读取查询字符串中的值(或路线值)。正如maddockst的回答中所述,在DefaultModelBinder
GET调用中使用JSON.stringify()
,您生成的网址为
$.ajax()
而不是必需的
.../Resource/GetInitialReviewData{"resourceId":"someValue"}