如何让远程JSON与ASP.NET中的Kendo网格一起使用

时间:2012-12-31 19:22:08

标签: asp.net json kendo-ui

我可以使用以下代码成功地对我的服务进行AJAX调用:

var serverData = { "ZoneParent": "123" };

        var request = $.ajax({
            type: "POST",
            url: "/./Services/Reports.svc/getZones",
            contentType: "application/json",
            dataType: "json",
            jsonp: null,
            jsonpCallback: null,
            data: JSON.stringify(serverData)
        });


        request.done(function (msg) {
            alert(JSON.stringify(msg));
        });

        request.fail(function (jqXHR, textStatus) {
            alert("Request failed: " + textStatus);
        });

但是,当我尝试使用我的Kendo网格实现相同的调用时,我收到错误

  

传入的消息具有意外的消息格式“Raw”。操作的预期消息格式是'Xml','Json'

用于getZones。我的服务调用与DataTables一起工作正常,但我想潜在地切换到Kendo。我已经搞砸了好几天无济于事。该应用程序不是MVC。这是我的Kendo代码片段:

var dataSource = new kendo.data.DataSource({

        transport: {

            read: {

                url: "/./Services/Reports.svc/getZones",

                dataType: "JSON",

                data: { zoneParent: "123" },

                    type: "POST"
            },

            parameterMap: function (data, operation) {
                    return kendo.stringify(data);
                }
        },

            schema: {

                data: "d"
            }
    });

    var grid = $("#allGrids").kendoGrid({

        dataSource: dataSource,

        height: 200
    });

3 个答案:

答案 0 :(得分:5)

由于 cfeduke 提出了类似建议,您可以尝试将contentType添加到传输读取配置的读取对象,就像在 $。ajax 调用中一样。

e.g。

var dataSource = new kendo.data.DataSource({

    transport: {

        read: {

            url: "/./Services/Reports.svc/getZones",

            dataType: "json",

            contentType: "application/json",

            data: { zoneParent: "123" },

                type: "POST"
        },

        parameterMap: function (data, operation) {
                return kendo.stringify(data);
            }
    },

答案 1 :(得分:2)

听起来服务器的回复“Content-type”标题不是预期的“application / json”。

您可以使用cURL

curl -v -H "Content-type:application/json" -H "Accept:application/json" \
http://localhost/Services/Reports.svc/getZones 

调用端点并检查返回的标头值(-v是详细的,如果没有它,你将看不到标题)。

有时只是设置一个“Accept:application / json”标题足以揭示问题 - 服务器将输出强制转换为JSON,或者抛出可以追踪的错误。

答案 2 :(得分:0)

我正在调查是否还有另一种解决方法。但似乎剑道有很多限制,这就是其中之一。 Datables不需要标头,只需要JSON格式。

这是您需要添加到发送数据的控制器(如果是ajax调用)

  

标题("内容类型:application / json");

我希望它不会像这样,但剑道强迫我相信。我更喜欢数据表,更自由,你可以自定义更多。