Javascript JSON.stringify异常行为

Javascript JSON.stringify异常行为,javascript,jquery,ajax,asp.net-mvc,kendo-grid,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用法中确切的一些代码来填充ajax调用中的data参数。

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

我建立了一个名为
searchValues
的搜索值。放置
console.log(JSON.stringify({“values”:searchValues}))在我的代码中,打开Chrome的控制台,输出以下内容

{"values":["name_last:foo"]}
我使用
console.log
用法中确切的一些代码来填充ajax调用中的
data
参数。然而,在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
我在剑道格网中使用它,但我指定它作为post发送:

    $("#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:

我已经在jQueryAjax构造函数上试用了
processData
traditional
设置,我得到的最好结果是现在的帖子正文看起来像这样

[object Object]

根据在fiddler中得到的结果,似乎有什么东西在对json字符串调用$.param。jQuery不这样做,所以它必须是剑道网格


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

经过一些研究后,我的解决方案是使用
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);
                }
            }
        }
    }
});

看起来字符串被当作字符数组处理,而不是直接使用。也许
数据
应该是一个对象,而不是字符串?我对剑道不是很熟悉,但你确定它希望你自己做字符串定位吗?我使用过的框架希望您只给它们基本的JSON对象,它们会在请求过程中根据需要对其进行字符串化(可能基于内容类型)@Katana314我非常确定它们的read属性只是传递给jQuery ajax调用。我按照您的建议尝试了一下,并完全删除了JSON.stringify。不过,这并没有改变这种行为。无论如何谢谢你!有人在json字符串上使用了$.param。jQuery并没有做到这一点,所以我怀疑它与kendo@KevinB我想做多个账户,只是为了给你的答案投票。请贴出答案。我在ajax调用的
success
参数中反转了设置kendoGrid的调用,而不是让调用
.kendoGrid
来完成所有工作。