jqGrid正在加载JSON,但没有显示它
本文关键字:显示 加载 JSON jqGrid | 更新日期: 2023-09-27 18:29:21
我已经阅读了关于这个问题的各种各样的帖子和文档,我已经尝试了我所读到的和能想到的一切——仍然被难住了。
我正在尝试将JSON数据从服务器加载到Dot-Net-Nuke网站中的jqGrid中。使用DNN不是我的选择,所以没有不使用它的选择。也就是说,我已经建立了一个标准的DNN网站,并添加了一个C#类库项目(名为ApiLibrary)。在它中,有两个类:
RouteMapper.cs
using DotNetNuke.Web.Api;
namespace ApiLibrary
{
public class RouteMapper : IServiceRouteMapper
{
public void RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute("ApiLibrary", "default", "{controller}/{action}", new[] { "ApiLibrary" });
}
}
}
以及WelcomeController.cs,其中包含我的AJAX函数。我在jqGrid中使用的是以下内容:
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
public string GetMyData(string sidx, string sord, int page, int rows)
{
var myList = GetTransportTable(); // returns List<TransportInfo>
var rowlist = new List<Row>() { };
int m = 0;
for (var i = 0; i < myList.Count; i++)
{
m = i + 1;
Row rowobj = new Row();
var stringList = new List<string>();
rowobj.id = m.ToString();
stringList.Add(myList[i].Pilot);
stringList.Add(myList[i].Vessel);
stringList.Add(myList[i].Dock);
stringList.Add(myList[i].Amount.ToString("c"));
rowobj.cell = stringList;
rowlist.Add(rowobj);
}
var jsonToReturn = new
{
total = 3,
page = 1,
records = myList.Count.ToString(),
rows = rowlist.ToArray()
};
string jData = string.Empty;
jData = JsonConvert.SerializeObject(jsonToReturn);
return jData;
}
这将返回100%有效的JSON(在jslint上验证),其格式为jqGrid所需的格式,即:
{"总计":"4","page":"1","记录":"4","行":[{"id":"1","cell":["Myname","Myboat","MySdock","144"]},{"id":"2","cell":["Myname1","Myboat1","MySdock1","1414"]}]}
对于jqGrid文档中列出的每个事件,如果在该事件期间执行alert()
来显示数据,那么它将显示我格式完美的JSON。这告诉我,jqGrid接收数据很好,但有些东西阻止了它显示数据。
我尝试过使用jsonReader、jsonmap,以及我遇到的几乎所有其他建议/选项。
我已经反复检查了我的javascript和css引用,这些都很好用。这是我加载网格的Javascript:
$("#reviewList").jqGrid({
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
url: 'DesktopModules/ApiLibrary/API/Welcome/GetMyData',
jsonReader: {
repeatitems: false,
id: "id",
root: "rows",
page: "page",
total: "total",
records: "records",
cell: "cell"
},
colNames: ['Pilot', 'Vessel', 'Dock', 'Amount'],
colModel: [
{ name: 'Pilot', width: 250, align: 'center' },
{ name: 'Vessel', width: 250, align: 'center' },
{ name: 'Dock', width: 175, align: 'center' },
{ name: 'Amount', width: 110, align: 'center' }
],
rowNum: 10,
rowList: [10, 20, 30],
pager: "#pager2",
viewrecords: true,
sortname: 'Pilot',
sortorder: 'asc',
caption: 'Transport List Overview'
}).navGrid("#pager2", { edit: false, add: false, del: false });
值得注意的是,我在同一个页面上使用了其他几个AJAX调用jQuery(包括GET和POST),并且在解析任何JSON时都没有遇到任何问题。此外,使用JSON(来自jqGrid之外的jQueryAJAX调用),我可以在jqGrid中显示它。然而,由于它是本地数据,我无法对其进行排序/分页/搜索-这对我没有好处。
出了什么问题?
我深入研究了DNN服务框架,通过在WelcomeController.cs中将我的AJAX方法修改为以下方法,我能够实现这一点:
[System.Web.Http.HttpPost]
public HttpResponseMessage GetMyData()
{
var myList = GetTransportTable(); //returns List<TransportInfo>
var rowlist = new List<Row>() { };
for (var i = 0; i < myList.Count; i++)
{
Row rowobj = new Row();
var stringList = new List<string>();
rowobj.id = i;
stringList.Add(myList[i].DockDate.ToString("d"));
stringList.Add(myList[i].Pilot);
stringList.Add(myList[i].Vessel);
stringList.Add(myList[i].Dock);
stringList.Add(myList[i].Amount.ToString("c"));
rowobj.cell = stringList;
rowlist.Add(rowobj);
}
var jsonToReturn = new
{
total = 1,
page = 1,
records = myList.Count.ToString(),
rows = rowlist
};
return Request.CreateResponse(HttpStatusCode.OK, jsonToReturn);
}
在我的javascript中,我删除了jsonReader并添加了mtype:'POST'
。新的jqGrid函数是:
$("#reviewList").jqGrid({
loadError: function(xhr, status, error) {
alert('load error: ' + error);
},
mtype: 'POST',
ajaxGridOptions: { contentType: 'application/json; charset=utf-8' },
url: 'DesktopModules/ApiLibrary/API/Welcome/GetMyData',
datatype: "json",
colNames: ['Date','Pilot', 'Vessel', 'Dock', 'Amount'],
colModel: [
{name: 'DockDate', index:'DockDate', width: 90, align: 'center'},
{ name: 'Pilot', index: 'Pilot', width: 250, sortable: true, align: 'center' },
{ name: 'Vessel', index: 'Vessel', width: 250, sortable: true, align: 'center' },
{ name: 'Dock', index: 'Dock', width: 175, sortable: true, align: 'center' },
{ name: 'Amount', index: 'Amount', width: 110, sortable: true, align: 'center', sorttype: 'float' }
],
rownumbers: true,
rowNum: 10,
rowList: [10, 20, 30],
pager: "#pager2",
viewrecords: true,
caption: 'Transport List Overview',
height: "auto"
//loadonce: true
}).navGrid("#pager2", { edit: false, add: false, del: false });