jqGrid数据格式问题
现在我们的项目中使用了jqGrid这个jquery的插件,从各个方面来说,都很不错,我测试一个下在一次加载30000条数据的调用,大概用时240ms~300ms之间,这是我以前用过的grid控件中最为优秀的之一,我们后端使用的是WCF,第一个示例很快就完成了,由于WCF在我们的系统中有BS的调用,也有CS客户端的调用,所有不可能让其返回jsonString,设计部门要求返回为List<T>,经WCF序列化后如下:
jsonString为:
{"d":[{"__type":"User","Id":1,"Code":"code0","AbbrName":"nm0","Description":"d0","Name":"name2","QuickCode":"qc","......
我们使用local方式加载数据,这样对于数据只要求一个经过WCF序列化的 List<T> 就可以了,所有的分页,都有客户端的jqGrid自己来完成.
很方便.
经测试30000条数据一次加载时间为约260ms(第一次WCF启动除外),基本可以满足需要.由于行业特殊,数据量非常大,所在设计部门要求用分页
实现,现实的一个问题是:如何设置数据格式,网上的大多是在服务器端就生成好符合jqGrid格式的jsondata,而且生成很麻烦。我们的系统不可以这样,因为还有CS客户端的调用问题,你不可能让WCF返回给CS客户端一个符合了jqGrid数据格式的jsonStirng,还有就是WCF会对返回的String 再做一次序列化,是不是很浪费资源?
为此我专门看了jqGrid4.0的源码,发现其实它也可以支持非id:"id",cell:[.....],格式的数据,原因是它在内部实现就是使用了这种非id:"id",cell:[...]格式的数据
为了和设计上的统一,我专门写了如下一个类做为WCF的返回值:
using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; namespace aco.service.dto { [DataContract(Namespace = "")] public class GridData<T> where T:class { public GridData() { } public GridData(int reqPage, int totalPages, int records, IList<T> lst) { this.Page = reqPage; this.Total = totalPages; this.Records = records; this.Rows = lst; } [DataMember] public int Page { get; set; } [DataMember] public int Total{ get; set; } [DataMember] public int Records { get; set; } [DataMember] public IList<T> Rows { get; set; } } }
和设计部门沟通好后,使用GridData(或者其子类)做为WCF的返回类型,这样这个WCF 就可以被配置为方便的CS客户端调用了,而不是给CS客户端返回一个jsonString了,这个类型经WCF序列化后,由jsonReader读取,便可以加载数据。
分页部分代码如下:
View Code
/// <summary>
/// 分页返回用户的信息
/// </summary>
/// <param name="reqPage">请求的页面</param>
/// <param name="pagesize">页面容量</param>
/// <returns></returns>
public aco.service.dto.UserData GetUserData(int reqPage,int pageSize)
{
util.Logger.log("reqPage is:" + reqPage + "\n\rPageSize is:" + pageSize);
int records = 0;
int pages = 0;
aco.service.dto.UserData ud =null;
try
{
aco.sysMgr.repository.IUserRepository ur = new aco.sysMgr.repository.UserRepositoryImpl();
records = ur.GetBeanCount<User>();
if (records < 1)
return null;
//参数出错时可以处理,同时将初化对象放在这里
if (pageSize < 1) pageSize = 10;
pages = (records + pageSize - 1) / pageSize;
if (reqPage > pages) reqPage = pages;
if (reqPage < 1) reqPage = 1;
IList<User> lst = ur.Load<User>((reqPage - 1) * pageSize, pageSize);
ud = new dto.UserData();
ud.Page = reqPage;
ud.Total = pages;
ud.Records = records;
ud.Rows = lst;
}
catch (Exception ex)
{
util.Logger.log(ex.StackTrace);
}
return ud;
}
以下是UserData:GridData 经WCF序列化后的数据:
好了,接下来就是使用jsonReader加载数据了,这个就不用说了.