Javascript JSON.stringify异常行为
我正在包装一些值以发送回ASP.NET MVC控制器操作。我得到了无效的JSON原语异常,但我使用的是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参数。
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
来完成所有工作。