Kendo jQuery 网格数据源为空但 json return 来自服务器
Kendo jQuery grid datasource empty but json return from server
所以我已经为此苦思了几天了。在开发环境中工作,我在 VM 上有一个测试 WebAPI 站点 运行。它可以通过网络访问(使用 un/pw)并且正在返回 JSON。我正在使用 jsonp,因为它在不同的子域上抱怨跨域。它正在返回 XML 但我使用了 this reference to get the JSON output. I've also used Telerik's site for all the references I could find. telerik jquery grid source
[{
"id": 2,
"ProcessName": "#######",
"Password": "########",
"Username": "########"
}, {
"id": 3,
"ProcessName": "#######",
"Password": "#######",
"Username": "#######"
},{ "id": 4,
"ProcessName": "#######",
"Password": "#######",
"Username": "#######"
}, { "id": 5,
"ProcessName": "#######",
"Password": "#######",
"Username": "#######"
}]
我已经尝试了多种方法来读取 URL 并将数据解析到数据源中,但每次,源都保持为空并且不会抛出任何错误。返回的内容类型是 application/json
这是最近的一次尝试,它确实正确地构建了网格显示,但当然没有数据。这个错误是从 ajax 请求中抛出的,我不知道为什么!
<script type="text/javascript">
$(document).ready(function() {
var apDs = new kendo.data.DataSource({
transport: {
read: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo"}
});
var remoteDataSource = new kendo.data.DataSource({
type: 'odata',
transport: {
read:{
url: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo",
dataType: "json"} , //json datatype works here
parameterMap: function (data, operation) { return JSON.stringify(data);
}} ,
pageSize: 12,
serverPaging: true,
serverFiltering: true,
serverSorting: true,
schema: {
data: "data"
}
});
$("#myGrid").kendoGrid({
dataSource: {apDs},
height: 550,
filterable: true,
sortable: true,
pageable: true,
columns: [{
field:"id",
filterable: false
},
{
field: "ProcessName", title: "Process Name"
},
{
field: "Username",
title: "User Name"
},
{
field: "Password",
title: "Password"}]
});
});
$.ajax({
type: "GET",
url: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo",
dataType: "jsonp", //json does NOT work here, must be jsonp
success: function (result) {
var grid = $("#myGrid").data("kendoGrid");
var ds = new kendo.data.DataSource({ data: result });
grid.setDataSource(ds);
grid.dataSource.read();
},
error: function (httpRequest,textStatus,errorThrow){
alert("ERROR: " + textStatus + " " + errorThrow + ' ' + httpRequest);
}
});
所以经过更多的挖掘和摸索,我终于偶然发现了一个fix/work。
虽然我的 API 返回了 json,但导致数据源出现问题的并不是 JSONP。
我发现了这个问题,JSONP with ASP.Net WebAPI and this GitHub/Nuget 包效果很好。
通过安装 nuget 包并将 GlobalConfiguration.Configuration.AddJsonpFormatter();
添加到我的 Global.asax.cs 并将此代码添加到我的 WebApiConfig.cs 我现在可以请求 text/xml, text/json and/or text/jsonp 并收到正确的响应。
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/json"));
}
}
public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
this.SerializerSettings.Formatting = Formatting.Indented;
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}
所以我已经为此苦思了几天了。在开发环境中工作,我在 VM 上有一个测试 WebAPI 站点 运行。它可以通过网络访问(使用 un/pw)并且正在返回 JSON。我正在使用 jsonp,因为它在不同的子域上抱怨跨域。它正在返回 XML 但我使用了 this reference to get the JSON output. I've also used Telerik's site for all the references I could find. telerik jquery grid source
[{ "id": 2, "ProcessName": "#######", "Password": "########", "Username": "########" }, { "id": 3, "ProcessName": "#######", "Password": "#######", "Username": "#######" },{ "id": 4, "ProcessName": "#######", "Password": "#######", "Username": "#######" }, { "id": 5, "ProcessName": "#######", "Password": "#######", "Username": "#######" }]
我已经尝试了多种方法来读取 URL 并将数据解析到数据源中,但每次,源都保持为空并且不会抛出任何错误。返回的内容类型是 application/json
这是最近的一次尝试,它确实正确地构建了网格显示,但当然没有数据。这个错误是从 ajax 请求中抛出的,我不知道为什么!
<script type="text/javascript">
$(document).ready(function() {
var apDs = new kendo.data.DataSource({
transport: {
read: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo"}
});
var remoteDataSource = new kendo.data.DataSource({
type: 'odata',
transport: {
read:{
url: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo",
dataType: "json"} , //json datatype works here
parameterMap: function (data, operation) { return JSON.stringify(data);
}} ,
pageSize: 12,
serverPaging: true,
serverFiltering: true,
serverSorting: true,
schema: {
data: "data"
}
});
$("#myGrid").kendoGrid({
dataSource: {apDs},
height: 550,
filterable: true,
sortable: true,
pageable: true,
columns: [{
field:"id",
filterable: false
},
{
field: "ProcessName", title: "Process Name"
},
{
field: "Username",
title: "User Name"
},
{
field: "Password",
title: "Password"}]
});
});
$.ajax({
type: "GET",
url: "http://xxx.xxx.xxx.xxx/Sec/Api/ProcessInfo",
dataType: "jsonp", //json does NOT work here, must be jsonp
success: function (result) {
var grid = $("#myGrid").data("kendoGrid");
var ds = new kendo.data.DataSource({ data: result });
grid.setDataSource(ds);
grid.dataSource.read();
},
error: function (httpRequest,textStatus,errorThrow){
alert("ERROR: " + textStatus + " " + errorThrow + ' ' + httpRequest);
}
});
所以经过更多的挖掘和摸索,我终于偶然发现了一个fix/work。
虽然我的 API 返回了 json,但导致数据源出现问题的并不是 JSONP。
我发现了这个问题,JSONP with ASP.Net WebAPI and this GitHub/Nuget 包效果很好。
通过安装 nuget 包并将 GlobalConfiguration.Configuration.AddJsonpFormatter();
添加到我的 Global.asax.cs 并将此代码添加到我的 WebApiConfig.cs 我现在可以请求 text/xml, text/json and/or text/jsonp 并收到正确的响应。
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/json"));
}
}
public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
this.SerializerSettings.Formatting = Formatting.Indented;
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}