JqGrid addJSONData+;ASP.NET 2.0 WS
我有点迷路了。我尝试实现一个基于JqGrid的解决方案,并尝试使用函数作为数据类型。我已经按照书中的内容进行了设置,我调用了WS并返回了JSON,我在客户端的ajax调用中获得了成功,我使用JqGrid addJSONData+;ASP.NET 2.0 WS,asp.net,jquery,web-services,json,jqgrid,Asp.net,Jquery,Web Services,Json,Jqgrid,我有点迷路了。我尝试实现一个基于JqGrid的解决方案,并尝试使用函数作为数据类型。我已经按照书中的内容进行了设置,我调用了WS并返回了JSON,我在客户端的ajax调用中获得了成功,我使用addJSONData对jqGrid进行了“绑定”,但网格仍然是空的。我现在没有任何线索。。。相同页面上的其他“本地”示例可以正常工作(jsonstring…) 我的WS方法如下所示: [WebMethod] [ScriptMethod(ResponseFormat = ResponseFor
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"]“}]}
{"d": "{”page”:”1″,”total”:”10″,”records”:”160″,”rows”:[{"id":"18","cell":"["18","BAM","Konvertibilna marka","977"]“}"
我已注册此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工作——我的web服务方法返回一个数组,所以看起来使用addRowData可以工作
function ReceivedClientData(data) {
var thegrid = $("#list4");
for (var i = 0; i < data.length; i++) {
thegrid.addRowData(i+1, data[i]);
}
}
函数接收客户端数据(数据){
var thegrid=$(“#列表4”);
对于(变量i=0;i
实际上,关键似乎是addJSONData上的参数,这些参数在文档中没有出现:
function ReceivedClientData(data) {
var thegrid = $("#rowed2");
thegrid[0].addJSONData(data,thegrid.bDiv,9)
}
随之而来的web方法是:
[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;
}
[WebMethod(EnableSession=true)]
公共对象getTestClient(int pagenum,int行)
{
var lst=会话[“lst”]作为列表;
如果(lst==null)
{
lst=新列表();
对于(inti=1;i,jqGrid的设置看起来很好
您确定在jsondata.responseText
中返回的内容就是您所描述的吗
我在.NET中编写的Web服务返回如下格式的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"]“}]}
{"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服务获得的输出,并确保您可以得到要执行的“complete”语句。这对我来说是可行的:
mygrid[0].addJSONData(result, mygrid.bDiv, 0);
或者试试这个:
mygrid[0].addJSONData($.toJSON(result), mygrid.bDiv, 0);
我的网格数据类型是jsonstring。我还使用Web服务将数据传递给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。我知道它很旧,但这可能是您的问题
把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解析器而不是eval。我自己使用Crockford的json2.js的修改版本,但YMMV
这应该使每一行都符合您的要求,让序列化程序处理转换…我实际上将我的数据表序列化为{columns:['colname',…],rows:['row1val',…],['row2val',…],…],…]}和frob it客户端,因为我使用了一些相同的调用来填充各种网格…我有一个客户端selectForJqGrid(table,keycol,[col list]),将其设置为直接用于jqGrid。您的问题是,您应该将addJSONData
与responseText一起使用。eval
它,然后将JSON字符串解析为JavaScript中的JSON。这应该可以解决问题
对于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
},
我对jqGrid的一些建议是多么的误导感到惊讶
有两种方法可以从您的服务向jqGrid提供JSON数据
您可以编写一个方法来为jqGrid返回一个“块”数据,其中的数据只够一页结果
或者,您可以让自己的生活变得轻松,一次返回所有JSON数据,让jqGrid处理分页,而无需进一步调用JSON服务
关键是loadonce jqGrid设置:
loadonce: true,
例如,我有一个JSON web服务,它返回特定客户ID的订单列表:
…我想用它创建这个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数据数组存储在我的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
此示例的完整演练可在我的博客上找到:
(我希望在三小时前,当我开始研究这些问题时,我能读到这篇文章!!)我得到的json与发布的类似,因为我使用了非.net json序列化程序。对,请仔细检查。您是否尝试在document.ready或onclick函数期间自己执行该函数?只是想看看它是否自己添加了该函数?谢谢,这是解决方案:)请有人把Tom的答案作为答案:)谢谢如果你不分页,你可以将这些行嵌入到一个对象标记中…{“页面”:1,“总计”:1,“记录”:rows.length,“记录”:rows}并将其与addJSONData一起使用。这是一个解决方案,根据你从Web服务获得的内容进行一些修改……对我来说是:success:function(jsondata,stat){var thegrid=$(“#list”);var evaluated=JSON.parse(jsondata.d);for(var i=0;i