【问题标题】:JSON.stringify odd behaviorJSON.stringify 奇怪的行为
【发布时间】:2016-01-06 14:38:00
【问题描述】:

我正在打包一些值以发送回 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

我在剑道网格中使用它,但我指定它以邮寄方式发送:

    $("#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 构造函数中尝试了 processData 和 traditional 设置,我得到的最好的结果是帖子正文现在看起来像

[object Object]

【问题讨论】:

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

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2015-07-20
      • 2010-10-03
      • 2021-07-12
      相关资源
      最近更新 更多