3

我可以使用以下代码成功地对我的服务进行 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);
        });

但是,当我尝试用我的剑道网格实现相同的调用时,我得到一个错误

传入消息具有意外的消息格式“原始”。该操作的预期消息格式为“Xml”、“Json”

对于 getZones。我的服务调用适用于 DataTables,但我想潜在地切换到 Kendo。我已经搞砸了几天无济于事。该应用程序不是 MVC。这是我的剑道代码片段:

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
    });
4

3 回答 3

5

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

例如

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);
            }
    },
于 2013-01-01T12:35:23.930 回答
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,或者引发可以追踪的错误。

于 2012-12-31T21:23:56.407 回答
0

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

这是您需要添加到发送数据的控制器的内容(以防其 ajax 调用)

header("内容类型:应用程序/json");

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

于 2014-04-09T16:35:05.510 回答