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加载数据了,这个就不用说了.





posted on 2011-09-10 15:05  unidoz  阅读(934)  评论(0编辑  收藏  举报

导航