我有点失落。我试图实现基于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"));
基本上我觉得它一定是蠢事......但我现在想不出来......
答案 0 :(得分:9)
过去几个小时我一直试图解决同样的问题。我现在放弃了让AddJSONData工作 - 我的web服务方法正在返回一个数组,所以看起来使用addRowData会起作用。
function ReceivedClientData(data) {
var thegrid = $("#list4");
for (var i = 0; i < data.length; i++) {
thegrid.addRowData(i+1, data[i]);
}
}
答案 1 :(得分:2)
jqGrid的设置看起来很好。
你确定你在jsondata.responseText
中得到的是你所描述的吗?
我在.NET中编写的Web服务返回格式如下:
{"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服务获得的输出,并确保只需将该语句执行为“完成”即可。
答案 2 :(得分:1)
实际上,密钥似乎是addJSONData上没有出现在docs中的参数:
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;
}
答案 3 :(得分:1)
我也使用webservice将数据传递给jqGrid。我遇到了同样的问题,这里是.ajax函数完整部分的代码。
complete: function(jsondata, stat) {
if (stat == "success") {
var thegrid = jQuery("#list2")[0];
var jsonObject = eval('(' + jsondata.responseText + ')');
thegrid.addJSONData(jsonObject.d);
}
}
在将responseText计算为JSON对象之后,键是 .d 。
答案 4 :(得分:0)
这对我有用:
mygrid[0].addJSONData(result, mygrid.bDiv, 0);
或试试这个:
mygrid[0].addJSONData($.toJSON(result), mygrid.bDiv, 0);
我的网格数据类型是jsonstring。
答案 5 :(得分:0)
我知道它已经过时了,但这可能是你的问题......
将row.cell作为List,然后你就可以......
row.cell = new List {
dr["DenarnaEnotaID"]
,dr["Kratica"]
,dr["Naziv"]
,dr["Sifra"]
};
在剧本方面......
var myjsongrid = eval('('+clearJson+')');
...
thegrid.addJSONData(myjsongrid.replace(/\\/g,''));
myjsongrid此时是一个Object,对象上通常没有.replace方法。此外,您应该使用eval的JSON解析器。我自己使用Crockford的json2.js的修改版本,但YMMV。
这应该让每一行都是你想要的,让序列化器处理转换...我实际上将我的数据表序列化为{columns:['colname',...],rows:[['row1val',. ..],['row2val',...],...]}并在客户端使用,因为我使用了一些相同的调用来填充各种网格...我有一个客户端selectForJqGrid(表, keycol,[col list])将其设置为直接用于jqGrid。
答案 6 :(得分:0)
您的问题是您应该将addJSONData
与responseText一起使用。 eval
然后在JavaScript中将JSON字符串解析为JSON。这应该可以解决。
对于Frenchie的回答我仍然会添加一些提示:
complete: function(jsondata, stat) {
if (stat == "success") {
var jsonObject = (eval("(" + jsondata.responseText + ")"));
$('#list2')[0].addJSONData(JSON.parse(jsonObject.d));
}
}
这就是你的JSON。并且应该使用JsonReader
正确配置JqGrid,以便在加载数据时不会出现错误,例如:提供您拥有的任何索引。这应该可以解决你的问题。
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
},
答案 7 :(得分:0)
我对一些jqGrid建议的误导性感到非常惊讶。
有两种方法可以为您的服务提供带有JSON数据的jqGrid。
你可以写一个方法来返回一个&#34; chunk&#34; 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
},
这可以防止讨厌&#34; addJSONdata&#34;发生异常,告诉jqGrid实际上,我们的JSON数据数据存储在我的JSON结果的 GetOrdersForCustomerResult 部分。
{
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
(我希望我在三小时前阅读这篇文章,当时我开始研究这些问题!!)