AJAX和数据格式问题

时间:2017-06-13 23:22:18

标签: javascript jquery json ajax asp.net-mvc

我有一些代码使用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 () {
        // ...
    }
});

但是这失败了,服务器上resourceIdnull的错误。

如果我删除了对JSON.stringify()的通话,那么它就可以了!

data: { resourceId: resourceId },

任何人都可以通过易于理解的方式解释这一点吗?为什么我需要JSON.stringify POST ,而不是 GET

2 个答案:

答案 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"}

datatype: '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}}方法中的参数并自行反序列化。通过添加stringcontentType: 'application/json; charset=utf-8'现在将使用DefaultModelBinder来读取字符串,对其进行反序列化(使用JsonValueProviderFactory)并将数据绑定到方法参数。

在GET的情况下,没有正文,JavaScriptSerializer选项不适用(它将被忽略),因为contentType只会读取查询字符串中的值(或路线值)。正如maddockst的回答中所述,在DefaultModelBinder GET调用中使用JSON.stringify(),您生成的网址为

$.ajax()

而不是必需的

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