我可以使用以下代码成功地对我的服务进行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
});
答案 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");
我希望它不会像这样,但剑道强迫我相信。我更喜欢数据表,更自由,你可以自定义更多。