的jqGrid addJSONData + ASP.NET 2.0 WS
-
23-08-2019 - |
题
我有点丢失。我一直在努力,实现基于jqGrid的解决方案,并试图用功能的数据类型。我通过这本书我想设置好的一切,我得到的WS调用,并得到JSON回来,我得到了客户方更迭在Ajax调用和使用addJSONData
我“绑定”的jqGrid但网格保留为空。我没有任何线索,现在也...在同一个页面等“本地”作品样本没有问题(jsonstring ...)
我的WS方法是这样的:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string GetGridData()
{
// Load a list
InitSessionVariables();
SA.DB.DenarnaEnota.DenarnaEnotaDB db = new SAOP.SA.DB.DenarnaEnota.DenarnaEnotaDB();
DataSet ds = db.GetLookupForDenarnaEnota(SAOP.FW.DB.RecordStatus.All);
// Turn into HTML friendly format
GetGridData summaryList = new GetGridData();
summaryList.page = "1";
summaryList.total = "10";
summaryList.records = "160";
int i = 0;
foreach (DataRow dr in ds.Tables[0].Rows)
{
GridRows row = new GridRows();
row.id = dr["DenarnaEnotaID"].ToString();
row.cell = "[" + "\"" + dr["DenarnaEnotaID"].ToString() + "\""
+ "," + "\"" + dr["Kratica"].ToString() + "\""
+ "," + "\"" + dr["Naziv"].ToString() + "\""
+ "," + "\"" + dr["Sifra"].ToString() + "\""
+ "]";
summaryList.rows.Add(row);
}
return JsonConvert.SerializeObject(summaryList);
}
我ASCX码是这样的:
jQuery(document).ready(function(){
jQuery("#list").jqGrid({
datatype : function (postdata) { jQuery.ajax({ url:'../../AjaxWS/TemeljnicaEdit.asmx/GetGridData',
data:'{}',
dataType:'json',
type: 'POST',
contentType: "application/json; charset=utf-8",
complete: function(jsondata,stat){
if(stat=="success")
{
var clearJson = jsondata.responseText;
var thegrid = jQuery("#list")[0];
var myjsongrid = eval('('+clearJson+')');
alfs
thegrid.addJSONData(myjsongrid.replace(/\\/g,''));
}
}
}
);
},
colNames:['DenarnaEnotaID','Kratica', 'Sifra', 'Naziv'],
colModel:[
{name:'DenarnaEnotaID',index:'DenarnaEnotaID', width:100},
{name:'Kratica',index:'Kratica', width:100},
{name:'Sifra',index:'Sifra', width:100},
{name:'Naziv',index:'Naziv', width:100}],
rowNum:15,
rowList:[15,30,100],
pager: jQuery('#pager'),
sortname: 'id',
// loadtext:"Nalagam zapise...",
// viewrecords: true,
sortorder: "desc",
// caption:"Vrstice",
// width:"800",
imgpath: "../Scripts/JGrid/themes/basic/images"});
});
从WS我得到JSON这样的:
{”page”:”1″,”total”:”10″,”records”:”160″,”rows”:[{"id":"18","cell":"["18","BAM","Konvertibilna marka","977"]“},{”id”:”19″,”cell”:”["19","RSD","Srbski dinar","941"]“},{”id”:”20″,”cell”:”["20","AFN","Afgani","971"]“},{”id”:”21″,”cell”:”["21","ALL","Lek","008"]“},{”id”:”22″,”cell”:”["22","DZD","Alžirski dinar","012"]“},{”id”:”23″,”cell”:”["23","AOA","Kvanza","973"]“},{”id”:”24″,”cell”:”["24","XCD","Vzhodnokaribski dolar","951"]“},{”id”:”25″,”cell”:”
………………
["13","PLN","Poljski zlot","985"]“},{”id”:”14″,”cell”:”["14","SEK","Švedska krona","752"]“},{”id”:”15″,”cell”:”["15","SKK","Slovaška krona","703"]“},{”id”:”16″,”cell”:”["16","USD","Ameriški dolar","840"]“},{”id”:”17″,”cell”:”["17","XXX","Nobena valuta","000"]“},{”id”:”1″,”cell”:”["1","SIT","Slovenski tolar","705"]“}]}
我已经注册该JavaScript:
clientSideScripts.RegisterClientScriptFile("prototype.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/prototype-1.6.0.2.js"));
clientSideScripts.RegisterClientScriptFile("jquery.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/jquery.js"));
clientSideScripts.RegisterClientScriptFile("jquery.jqGrid.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/jquery.jqGrid.js"));
clientSideScripts.RegisterClientScriptFile("jqModal.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/js/jqModal.js"));
clientSideScripts.RegisterClientScriptFile("jqDnR.js", CommonFunctions.FixupUrlWithoutSessionID("~/WebUI/Scripts/JGrid/js/jqDnR.js"));
基本上,我想它一定是愚蠢的东西......但现在我不出来...
解决方案
我一直在试图解决同样的问题在过去的几个小时。现在我已经放弃了让AddJSONData工作 - 所以它看起来像使用addRowData将工作我的web服务方法返回一个数组
function ReceivedClientData(data) {
var thegrid = $("#list4");
for (var i = 0; i < data.length; i++) {
thegrid.addRowData(i+1, data[i]);
}
}
其他提示
的jqGrid的设置看起来很好。
您确信您取回的jsondata.responseText
什么是你的描述?
这在我.NET写的web服务返回JSON格式是这样的:
{"d": "{”page”:”1″,”total”:”10″,”records”:”160″,”rows”:[{"id":"18","cell":"["18","BAM","Konvertibilna marka","977"]“}"
在我的职责,我不得不这样做:
complete: function(data) {
var stuff = JSON.parse(data.responseText);
jQuery("#grid")[0].addJSONData(JSON.parse(stuff.d));
}
我不得不把字符串转换成JSON前两次我居然得到了我所需要的数据。
如果您遇到很大的问题。我建议调试这一块一块的。执行一个简单的语句,如这样的:
jQuery("#list")[0].addJSONData(JSON.parse("{total: 1, page: 1, records: 1, rows : [ {id: '1', cell:['1', '2007-10-01', 'test', 'note', 'new', '200.00', '10.00', '210.00']} ] }"));
这应该至少是工作。之后,只需分析是从Web服务中获得的输出,并确保你可以得到该语句执行的“完整的”。
实际上,关键似乎是不出现在文档上addJSONData的参数:
function ReceivedClientData(data) {
var thegrid = $("#rowed2");
thegrid[0].addJSONData(data,thegrid.bDiv,9)
}
这与进入的幅材的方法是:
[WebMethod(EnableSession = true)]
public object GetTestClients(int pagenum, int rows)
{
var lst = Session["lst"] as List<Entities.Client>;
if (lst == null)
{
lst = new List<Entities.Client>();
for (int i = 1; i <= 5; i++)
{
lst.Add(new TF.WebApps.Entities.Client()
{
ClientID = "Client" + i,
Firstname = "first" + i,
Lastname = "last" + i
});
}
Session["lst"] = lst;
}
var v = from c in lst
select new
{
id = c.ClientID,
cell = new object[]
{
c.ClientID,
c.Firstname,
c.Lastname
}
};
var result = new
{
total = v.Count() / rows,
page = pagenum,
records = rows,
rows = v.Skip((pagenum-1)*rows).Take(rows).ToArray()
};
return result;
}
我还使用一个web服务将数据传递给一个的jqGrid。我遇到同样的问题,这里是在阿贾克斯功能的完整部分的代码。
complete: function(jsondata, stat) {
if (stat == "success") {
var thegrid = jQuery("#list2")[0];
var jsonObject = eval('(' + jsondata.responseText + ')');
thegrid.addJSONData(jsonObject.d);
}
}
的关键是在 .D 强>的responseText的被评估成JSON对象之后。
我知道这是老了,但是这可能是您的问题...
请row.cell一个列表,那么你可以做...
row.cell = new List {
dr["DenarnaEnotaID"]
,dr["Kratica"]
,dr["Naziv"]
,dr["Sifra"]
};
在脚本侧...
var myjsongrid = eval('('+clearJson+')');
...
thegrid.addJSONData(myjsongrid.replace(/\\/g,''));
myjsongrid是在这一点上的目的,一般不会在对象.replace方法。此外,你应该使用JSON解析器insted的的EVAL的。我用Crockford的修改后的版本json2.js自己,但情况因人而异。
这应该使每一行,你怎么想的那样,让串行处理转换......我其实我的序列化到数据表列{:“colname的”,...],行:[“row1val” ,. ..],[“row2val”,...],...]}和FROB它的客户端,因为我用一些相同的调用来填充不同的网格......我有一个客户端selectForJqGrid(表, KEYCOL,[COL列表]),将其设置为使用直接到的jqGrid。
这对我的作品:
mygrid[0].addJSONData(result, mygrid.bDiv, 0);
或者尝试这样的:
mygrid[0].addJSONData($.toJSON(result), mygrid.bDiv, 0);
我的网格数据类型jsonstring。
我有多么误导一些建议的jqGrid已经相当惊讶。
有两种方法可以从服务馈送的jqGrid与JSON数据。
您可以编写返回一个数据的“块”为jqGrid的,只有足够的数据结果页面的方法。
或者,你可以让生活方便自己,一气呵成返回所有的JSON数据,并且得到的jqGrid处理分页,而无需对您的JSON服务的任何进一步调用。
到它的关键是 loadonce 的jqGrid设定:
loadonce: true,
例如,我有一个JSON web服务,它返回订单列表特定客户ID:
http://www.iNorthwind.com/Service1.svc/getOrdersForCustomer/BERGS
..和我想创建此的jqGrid出来的:
下面是我的jqGrid声明会是什么样子:
$("#tblOrders").jqGrid({
url: 'http://www.iNorthwind.com/Service1.svc/getOrdersForCustomer/BERGS',
contentType: "application/json",
datatype: "json",
jsonReader: {
root: "GetOrdersForCustomerResult",
id: "OrderID",
repeatitems: false
},
mtype: "GET",
colNames: ["ID", "Date", "ShipName", "ShipAddress", "ShipCity", "ShippedDate"],
colModel: [
{ name: "OrderID", width: 80, align: "center" },
{ name: "OrderDate", width: 90, align: "center" },
{ name: "ShipName", width: 250 },
{ name: "ShipAddress", width: 250 },
{ name: "ShipCity", width: 95 },
{ name: "ShippedDate", width: 95 },
],
pager: "#pager",
height: 'auto',
rowNum: 8,
rowList: [8, 16, 24],
loadonce: true,
sortname: "OrderID",
sortorder: "desc",
viewrecords: true,
gridview: true,
autoencode: true,
caption: "Northwind orders"
});
注重上述这些三行:
jsonReader: {
root: "GetOrdersForCustomerResult",
id: "OrderID",
repeatitems: false
},
此防止发生讨厌的 “addJSONdata” 异常,并告诉的jqGrid的是,实际上,我们的数据的JSON数组存储在 GetOrdersForCustomerResult 的我的JSON结果的一部分。
{
GetOrdersForCustomerResult: [
{
OrderDate: "8/12/1996",
OrderID: 10278,
ShipAddress: "Berguvsvägen 8",
ShipCity: "Luleå",
ShipName: "Berglunds snabbköp",
ShipPostcode: "S-958 22",
ShippedDate: "8/16/1996"
},
{
OrderDate: "8/14/1996",
OrderID: 10280,
...etc...
这就是它。不需要调用AddJSONdata可言。
该实施例的完整的演练可以在我的博客中找到:
http://mikesknowledgebase.com/pages/Services/WebServices-Page10.htm
(我希望我能有这个文章读,三小时前,当我开始寻找到这些问题!)
您的问题是,你应该使用addJSONData
与responseText的。 eval
,然后解析JSON字符串JSON在JavaScript。这应该解决的罚款。
要Frenchie的答案,我仍然会增加一些提示吧:
complete: function(jsondata, stat) {
if (stat == "success") {
var jsonObject = (eval("(" + jsondata.responseText + ")"));
$('#list2')[0].addJSONData(JSON.parse(jsonObject.d));
}
}
这就是你的JSON。而jqGrid的应JsonReader
进行适当配置,使当你加载的数据等它没有给出一个错误:与你有任何指数提供。这应该解决您的问题。
jsonReader: {
root: "rows", //arry containing actual data
page: "page", //current page
total: "total", //total pages for the query
records: "records", //total number of records
repeatitems: false,
id: "DenarnaEnotaID" //index of the column with the PK in it
},