基于jqgrid + ashx + nhibernate的分页资料

本文主要介绍基于jqgrid + ashx + nhibernate的分页资料 方法和在新技术下所面对的“挑战”,方便大家深入理解基于jqgrid + ashx + nhibernate的分页资料 过程。本文也将分享基于jqgrid + ashx + nhibernate的分页资料 所遇到的问题和应对策略,怎么解决怎么做的问题。
通过深入本文可以理解代码原理,进行代码文档的下载,也可以查看相应 Demo 部署效果。

因为我目前运维的是一个webform项目,项目中未用到分页的功能,我百度了很多文章也没有一篇是结合jqgrid + ashx + nhibernate的分页,可能是因为后台要请求ashx的原因,不像mvc直接可以请求一个方法就可以了。

那就让我们从页面到后台来一步步解析jqgrid的分页吧。

 

1、初始化表格的代码如下

 function initGrid() {                  localGrid = jQuery("#tbList");         localGrid.jqGrid({             //data: localData,             url:"JqgridPageHandler.ashx",             datatype: "json",             gridview: true,             height: 300,             width: '95%',             rowNum: 10,             rowList: [10, 100, 500, 1000],             colNames: columns,             autowidth: true,             hoverrows: false,             colModel: [                 { name: 'Id', hidden: true, index: 'Id', width: 40, key: true },                 { name: 'Name', index: 'Name', width: 40, align: "center" },                 { name: 'ExamType', index: 'ExamType', width: 100, align: "center" },                 { name: 'Score', index: 'Score', width: 30, align: "center" },                 { name: 'QuerySite', index: 'QuerySite', width: 120, align: "center" },                 { name: 'ExamTime', index: 'ExamTime', width: 60, formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },                 { name: 'CreatedTime', index: 'CreatedTime', width: 60, formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },                 { name: 'StatusText', index: 'StatusText', width: 50, align: "center" },                 { name: 'Remark', index: 'Remark', width: 120, align: "center" }             ],             emptyrecords: "没有任何数据",             pager: "#pager",             viewrecords: true,             rownumbers: true,             //loadonce: true,             caption: "外语成绩单",             multiselect: false,             postData: {//参数                 name: $j("#name").val(),                 examType: $j("#examType").val(),                 startDate: startDate,                 endDate: endDate,                 isCreateTime: document.getElementById("<%=rbcreatedtime.ClientID %>").checked             },             jsonReader: {                 //rows: "rows",                 //page: "page",                 //total: "total",          //   很重要 定义了 后台分页参数的名字。                 //records: "records",                 repeatitems: false,                              }            }).navGrid('#pager', { edit: false, add: false, del: false, searchtext: "搜索" }, {}, {}, {}, { search: true, sopt: ['cn', 'eq', 'ge', 'gt', 'le', 'lt'] });          gridHelper.SetAutoResize(localGrid, -20, -265, true, true);     }

在这个初始化表格的代码中有几点是要注意的:

a. jsonReader中只要设置repeatitems 为 false就可以了 其它的被注掉的参数是默认的。

b. postData 参数是我们查询的条件。在调用这个方法时要初始化好参数对应的值。例如:startDate  和  endDate

2、在页面的JS执行入口加载数据可以这样写

 

jQuery(document).ready(function () {         initDate();         initGrid();     });

 

initDate()方法就是为了初始化参数的 startDate  和  endDate 的值

3、当我们进入页面时会调用2中的方法进入后台 JqgridPageHandler.ashx 中的ProcessRequest方法,我们再进入这个方法中看他是如何接收参数和构造返回值的吧.
 public void ProcessRequest(HttpContext context)         {             int pageSize = int.Parse(context.Request["rows"]);             int pageIndex = int.Parse(context.Request["page"]);             string name = context.Request["name"].ToString();             string examType = context.Request["examType"].ToString();             DateTime startDate =DateTime.Parse(context.Request["startDate"].ToString());             DateTime endDate = DateTime.Parse(context.Request["endDate"].ToString());             bool isCreateTime =bool.Parse(context.Request["isCreateTime"].ToString());              List<OilDigital.CGGL.BLL.Abroad.ES> eslist = ESService.GetByPage(isCreateTime, startDate, endDate, ProfileHelper.GetUnitCode(), name, examType, pageSize, pageIndex);             ISession session = NHibernateSessionManager.Instance.GetSession();             int count = ESService.GetCount(isCreateTime, startDate, endDate, ProfileHelper.GetUnitCode(), name, examType);             var resultJson = new              {                  count = count,                  page = pageIndex,                  //总页数=(总页数+页大小-1)/页大小                  total = (int)Math.Ceiling(((double) count) / pageSize),//总页数                  rows = eslist              };             context.Response.ContentType = "application/json; charset=utf-8";             context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(resultJson));                               }


context.Request["page"],context.Request["rows"]这个中的rows是jqgrid默认往后台传的参数,其它参数的都是我们在页面上通过postData构造的。
再看看我们返回的参数吧,前端页面要接收一个json的对象,其中rows中包括了行,total就总页数,count是总条数,page是当前页面。这样传到前台去就可以了。

另外我们页面上肯定还会加一个查询的按钮,点击查询时会重新去加载jqgrid.代码如下:
    function doQuery() {         initDate();         localGrid.jqGrid('clearGridData');         localGrid.jqGrid('setGridParam', {             url: 'JqgridPageHandler.ashx',             postData: {                 name: $j("#name").val(),                 examType: $j("#examType").val(),                 startDate: startDate,                 endDate: endDate,                 isCreateTime: document.getElementById("<%=rbcreatedtime.ClientID %>").checked             },             datatype: "json",             mtype: 'post',         }).trigger('reloadGrid');      }

因为在用户点击查询时可能会修改查询代码,那postData这里带上修改后的查询代码是很重要的。



4、我们再来看看ESService.GetByPage 和 ESService.GetCount 方法是如何在NHibernate中实现的吧
  public List<ES> GetByPage(bool isCreateTime,DateTime startDate, DateTime endDate, string unitCode, string name, string examType, int pageSize, int pageNumber)         {             try             {                 ISession session = NHibernateSessionManager.Instance.GetSession();                 ICriteria criteria = session.CreateCriteria(typeof(ES));                 if(isCreateTime)                 {                     criteria.Add(Expression.Between("CreatedTime", startDate, endDate));                 }                 else                 {                     criteria.Add(Expression.Between("ExamTime", startDate, endDate));                 }                                  if (!string.IsNullOrEmpty(unitCode))                     criteria.Add(Expression.Like("CeaterUnitCode", unitCode.Trim() + "%"));                 if (!string.IsNullOrEmpty(name))                 {                     criteria.Add(Expression.Eq("Name", name.Trim()));                 }                 if (!string.IsNullOrEmpty(examType))                 {                     criteria.Add(Expression.Like("ExamType", "%" + examType.Trim() + "%"));                 }                 criteria.AddOrder(Order.Desc("CreatedTime"));                 criteria.SetFirstResult((pageNumber - 1) * pageSize);                 criteria.SetMaxResults(pageSize);                 return ConvertToGenericList(criteria.List());             }             catch (Exception ex)             {                  throw new Exception(ex.Message);             }         }


这里面可以看到分页方法 SetFirstResult  和 SetMaxResults   其它都是加的一些查询条件。

这个方法只是获取了分页的数据,现在还需要获取总的数据条数,请看如下的方法:

public int GetCount(bool isCreateTime,DateTime startDate, DateTime endDate, string unitCode, string name, string examType)         {             StringBuilder sb = new StringBuilder();             if(isCreateTime)             {                 sb.AppendFormat("select count(*) from ES as es where es.CreatedTime between  convert(datetime,'{0}',111) and convert(datetime,'{1}',111)", startDate, endDate);             }else             {                 sb.AppendFormat("select count(*) from ES as es where es.ExamTime between  convert(datetime,'{0}',111) and convert(datetime,'{1}',111)", startDate, endDate);             }                                      if(!string.IsNullOrEmpty(unitCode))                {                    sb.AppendFormat(" and es.CeaterUnitCode like '{0}%'", unitCode.Trim());                }                  if(!string.IsNullOrEmpty(name))             {                 sb.AppendFormat(" and es.Name = '{0}'", name);             }             if(!string.IsNullOrEmpty(examType))             {                 sb.AppendFormat(" and es.ExamType like '%{0}%'", examType);             }             IEnumerator enumerator = session.CreateQuery(sb.ToString()).List().GetEnumerator();             enumerator.MoveNext();             return (int)enumerator.Current;         }

查询数据总条数是我是通过sql写的,暂时我也没有发现是否可以通过Expression表达式写,就像上面的查询数据的方法一样。如果可以那会省一次事,不用还去搞sql.

到此从前端到后端所有的代码都讲解完了,后台项目的中都可以用这个分页的方法了。

 

有需要大量进行微信投票或点赞的朋友可以给我留言哦!

 

 

 

基于jqgrid + ashx + nhibernate的分页资料部分资料来自网络,侵权毕设源码联系删除

区块链毕设网(www.qklbishe.com)全网最靠谱的原创区块链毕设代做网站
部分资料来自网络,侵权联系删除!
资源收费仅为搬运整理打赏费用,用户自愿支付 !
qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台 » 基于jqgrid + ashx + nhibernate的分页资料

提供最优质的资源集合

立即查看 了解详情