JSON.stringify奇怪的行为

时间:2016-01-06 14:38:01

标签: javascript jquery ajax asp.net-mvc kendo-grid

我正在包装一些值以发送回ASP.NET MVC控制器操作。我获得了无效的JSON原语异常,但我使用的是JSON.stringify并且很困惑。

我建立了一个名为searchValues的搜索值。将console.log(JSON.stringify({ "values": searchValues }));放入我的代码并打开Chrome控制台会输出以下内容

{"values":["name_last:foo"]}

我使用console.log用法的一些代码来填充data参数到ajax调用。但是,在Fiddler中观看呼叫时,发送的请求看起来像这样

0=%7B&1=%22&2=v&3=a&4=l&5=u&6=e&7=s&8=%22&9=%3A&10=%5B&11=%22&12=n&13=a&14=m&15=e&16=_&17=l&18=a&19=s&20=t&21=%3A&22=f&23=o&24=o&25=%22&26=%5D&27=%7D

我在Kendo网格中使用它,但我指定它作为帖子发送:

    $("#search-preview").kendoGrid({
        columns: ...column stuff...,
        dataSource: {
            transport: {
                read: {
                    url: "/SearchPreview",
                    dataType: "json",
                    data: JSON.stringify({"values": searchValues}),
                    type: "POST",
                    contentType: "application/json; charset=utf-8"
                }
            }
        }
    });

我可以在Fiddler中看到它在请求正文中发送而不是附加到URL,例如它是否为GET。这里发生了什么?

编辑:

添加整个Fiddler请求的内容:

POST http://localhost/MvcTestBed/SearchPreview HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 149
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Content-Type: application/json; charset=UTF-8
Referer: http://localhost/MvcTestBed
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: .... asp.net cookie fluff ....

0=%7B&1=%22&2=v&3=a&4=l&5=u&6=e&7=s&8=%22&9=%3A&10=%5B&11=%22&12=n&13=a&14=m&15=e&16=_&17=l&18=a&19=s&20=t&21=%3A&22=f&23=o&24=o&25=%22&26=%5D&27=%7D

编辑2:

我已经在jQuery ajax构造函数上尝试了processDatatraditional设置,并且我得到的最好的是帖子正文现在看起来像

[object Object]

2 个答案:

答案 0 :(得分:1)

根据你在fiddler中获得的结果,看起来有些东西在你的json字符串上调用$ .param。 jQuery不这样做,所以它必须是kendo网格。

一种解决方案是直接发出ajax请求,然后在成功中使用结果初始化网格。

答案 1 :(得分:0)

经过一些研究后,我的解决方案是使用read作为函数:

$("#search-preview").kendoGrid({
    columns: ...column stuff...,
    dataSource: {
        transport: {
            read: function (options) {
                url: "/SearchPreview",
                dataType: "json",
                data: JSON.stringify({"values": searchValues}),
                type: "POST",
                contentType: "application/json; charset=utf-8",
                success: function (result) {
                    options.success(result);
                },
                error: function (result) {
                    options.error(result);
                }
            }
        }
    }
});