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

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

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

  1. function initGrid() {
  2.  
  3. localGrid = jQuery("#tbList");
  4. localGrid.jqGrid({
  5. //data: localData,
  6. url:"JqgridPageHandler.ashx",
  7. datatype: "json",
  8. gridview: true,
  9. height: ,
  10. width: '95%',
  11. rowNum: ,
  12. rowList: [, , , ],
  13. colNames: columns,
  14. autowidth: true,
  15. hoverrows: false,
  16. colModel: [
  17. { name: 'Id', hidden: true, index: 'Id', width: , key: true },
  18. { name: 'Name', index: 'Name', width: , align: "center" },
  19. { name: 'ExamType', index: 'ExamType', width: , align: "center" },
  20. { name: 'Score', index: 'Score', width: , align: "center" },
  21. { name: 'QuerySite', index: 'QuerySite', width: , align: "center" },
  22. { name: 'ExamTime', index: 'ExamTime', width: , formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },
  23. { name: 'CreatedTime', index: 'CreatedTime', width: , formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },
  24. { name: 'StatusText', index: 'StatusText', width: , align: "center" },
  25. { name: 'Remark', index: 'Remark', width: , align: "center" }
  26. ],
  27. emptyrecords: "没有任何数据",
  28. pager: "#pager",
  29. viewrecords: true,
  30. rownumbers: true,
  31. //loadonce: true,
  32. caption: "外语成绩单",
  33. multiselect: false,
  34. postData: {//参数
  35. name: $j("#name").val(),
  36. examType: $j("#examType").val(),
  37. startDate: startDate,
  38. endDate: endDate,
  39. isCreateTime: document.getElementById("<%=rbcreatedtime.ClientID %>").checked
  40. },
  41. jsonReader: {
  42. //rows: "rows",
  43. //page: "page",
  44. //total: "total", // 很重要 定义了 后台分页参数的名字。
  45. //records: "records",
  46. repeatitems: false,
  47.  
  48. }
  49.  
  50. }).navGrid('#pager', { edit: false, add: false, del: false, searchtext: "搜索" }, {}, {}, {}, { search: true, sopt: ['cn', 'eq', 'ge', 'gt', 'le', 'lt'] });
  51.  
  52. gridHelper.SetAutoResize(localGrid, -, -, true, true);
  53. }

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

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

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

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

  1. jQuery(document).ready(function () {
  2. initDate();
  3. initGrid();
  4. });
  1. initDate()方法就是为了初始化参数的 startDate    endDate 的值
  2.  
  3. 3、当我们进入页面时会调用2中的方法进入后台 JqgridPageHandler.ashx 中的ProcessRequest方法,我们再进入这个方法中看他是如何接收参数和构造返回值的吧.
  1. public void ProcessRequest(HttpContext context)
  2. {
  3. int pageSize = int.Parse(context.Request["rows"]);
  4. int pageIndex = int.Parse(context.Request["page"]);
  5. string name = context.Request["name"].ToString();
  6. string examType = context.Request["examType"].ToString();
  7. DateTime startDate =DateTime.Parse(context.Request["startDate"].ToString());
  8. DateTime endDate = DateTime.Parse(context.Request["endDate"].ToString());
  9. bool isCreateTime =bool.Parse(context.Request["isCreateTime"].ToString());
  10.  
  11. List<OilDigital.CGGL.BLL.Abroad.ES> eslist = ESService.GetByPage(isCreateTime, startDate, endDate, ProfileHelper.GetUnitCode(), name, examType, pageSize, pageIndex);
  12. ISession session = NHibernateSessionManager.Instance.GetSession();
  13. int count = ESService.GetCount(isCreateTime, startDate, endDate, ProfileHelper.GetUnitCode(), name, examType);
  14. var resultJson = new
  15.  
  16. {
  17.  
  18. count = count,
  19.  
  20. page = pageIndex,
  21.  
  22. //总页数=(总页数+页大小-1)/页大小
  23.  
  24. total = (int)Math.Ceiling(((double) count) / pageSize),//总页数
  25.  
  26. rows = eslist
  27.  
  28. };
  29. context.Response.ContentType = "application/json; charset=utf-8";
  30. context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(resultJson));
  31.  
  32. }
  1.  
  1. context.Request["page"],context.Request["rows"]这个中的rowsjqgrid默认往后台传的参数,其它参数的都是我们在页面上通过postData构造的。
    再看看我们返回的参数吧,前端页面要接收一个json的对象,其中rows中包括了行,total就总页数,count是总条数,page是当前页面。这样传到前台去就可以了。
  2.  
  3. 另外我们页面上肯定还会加一个查询的按钮,点击查询时会重新去加载jqgrid.代码如下:
  1. function doQuery() {
  2. initDate();
  3. localGrid.jqGrid('clearGridData');
  4. localGrid.jqGrid('setGridParam', {
  5. url: 'JqgridPageHandler.ashx',
  6. postData: {
  7. name: $j("#name").val(),
  8. examType: $j("#examType").val(),
  9. startDate: startDate,
  10. endDate: endDate,
  11. isCreateTime: document.getElementById("<%=rbcreatedtime.ClientID %>").checked
  12. },
  13. datatype: "json",
  14. mtype: 'post',
  15. }).trigger('reloadGrid');
  16.  
  17. }

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

  1.  
  2. 4、我们再来看看ESService.GetByPage ESService.GetCount 方法是如何在NHibernate中实现的吧
  1. public List<ES> GetByPage(bool isCreateTime,DateTime startDate, DateTime endDate, string unitCode, string name, string examType, int pageSize, int pageNumber)
  2. {
  3. try
  4. {
  5. ISession session = NHibernateSessionManager.Instance.GetSession();
  6. ICriteria criteria = session.CreateCriteria(typeof(ES));
  7. if(isCreateTime)
  8. {
  9. criteria.Add(Expression.Between("CreatedTime", startDate, endDate));
  10. }
  11. else
  12. {
  13. criteria.Add(Expression.Between("ExamTime", startDate, endDate));
  14. }
  15.  
  16. if (!string.IsNullOrEmpty(unitCode))
  17. criteria.Add(Expression.Like("CeaterUnitCode", unitCode.Trim() + "%"));
  18. if (!string.IsNullOrEmpty(name))
  19. {
  20. criteria.Add(Expression.Eq("Name", name.Trim()));
  21. }
  22. if (!string.IsNullOrEmpty(examType))
  23. {
  24. criteria.Add(Expression.Like("ExamType", "%" + examType.Trim() + "%"));
  25. }
  26. criteria.AddOrder(Order.Desc("CreatedTime"));
  27. criteria.SetFirstResult((pageNumber - ) * pageSize);
  28. criteria.SetMaxResults(pageSize);
  29. return ConvertToGenericList(criteria.List());
  30. }
  31. catch (Exception ex)
  32. {
  33.  
  34. throw new Exception(ex.Message);
  35. }
  36. }
  1.  

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

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

  1. public int GetCount(bool isCreateTime,DateTime startDate, DateTime endDate, string unitCode, string name, string examType)
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. if(isCreateTime)
  5. {
  6. sb.AppendFormat("select count(*) from ES as es where es.CreatedTime between convert(datetime,'{0}',111) and convert(datetime,'{1}',111)", startDate, endDate);
  7. }else
  8. {
  9. sb.AppendFormat("select count(*) from ES as es where es.ExamTime between convert(datetime,'{0}',111) and convert(datetime,'{1}',111)", startDate, endDate);
  10. }
  11.  
  12. if(!string.IsNullOrEmpty(unitCode))
  13. {
  14. sb.AppendFormat(" and es.CeaterUnitCode like '{0}%'", unitCode.Trim());
  15. }
  16.  
  17. if(!string.IsNullOrEmpty(name))
  18. {
  19. sb.AppendFormat(" and es.Name = '{0}'", name);
  20. }
  21. if(!string.IsNullOrEmpty(examType))
  22. {
  23. sb.AppendFormat(" and es.ExamType like '%{0}%'", examType);
  24. }
  25. IEnumerator enumerator = session.CreateQuery(sb.ToString()).List().GetEnumerator();
  26. enumerator.MoveNext();
  27. return (int)enumerator.Current;
  28. }

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

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

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

  1.  
  1.  

基于jqgrid + ashx + nhibernate的分页的更多相关文章

  1. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  2. 基于视觉的Web页面分页算法VIPS的实现源代码下载

    基于视觉的Web页面分页算法VIPS的实现源代码下载 - tingya的专栏 - 博客频道 - CSDN.NET 基于视觉的Web页面分页算法VIPS的实现源代码下载 分类: 技术杂烩 2006-04 ...

  3. 基于存储过程的MVC开源分页控件

    基于存储过程的MVC开源分页控件--LYB.NET.SPPager 摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件M ...

  4. 利用JqGrid结合ashx及EF分页显示列表之二

    上一篇文章简单利用JqGrid及ashx进行一个数据列表的显示,要文的重点是利用EF的分页与JqGrid进行结合,EF本文只是简单运用所以没有很规范,重点还是JqGrid分页的实现;本实例把JqGri ...

  5. 基于Jquery+Ajax+Json+高效分页

    摘要 分页我相信大家存储过程分页已经很熟悉了,ajax更是耳熟能详了,更别说我们的json,等等. 如果说您没用过这些东东的话,我相信看完这篇博文会对您有帮助的,,如果有任何问题不懂或者有bug没问题 ...

  6. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  7. 基于Bootstrap仿淘宝分页控件实现

    .header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...

  8. Ecside基于数据库的过滤、分页、排序

    首先ecside展现列表.排序.过滤(该三种操作以下简称为 RSF )的实现原理完全和原版EC一样, 如果您对原版EC的retrieveRowsCallback.sortRowsCallback.fi ...

  9. 基于Entity Framework的自定义分页,增删改的通用实现

    简介 之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现. 代码 还是先上代码:https://github.com/jinwe ...

随机推荐

  1. Python实用笔记 (23)面向对象高级编程——使用__slots__

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...

  2. threading.local()使用与原理剖析

    threading.local()使用与原理剖析 前言 还是第一次摘出某个方法来专门写一篇随笔,哈哈哈. 为什么要写这个方法呢?因为它确实太重要了,包括后期的Flask框架源码中都有它的影子. 那么我 ...

  3. lodash - slice

    稀疏数组和密集数组 稀疏数组 Sparse arrays 一般来说,JavaScript 中的数组都是稀疏数组-它们可以拥有空槽,所谓空槽,指的就是数组的某个位置没有任何值,既不是 undefined ...

  4. Netty 源码解析(八): 回到 Channel 的 register 操作

    原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 今天是猿灯塔“365篇原创计划”第八篇. 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty 源码解析(一): 开始 Netty 源 ...

  5. Vue 项目推荐,Github 过万 Star

    电鸭社区-远程工作-自由职业-兼职外包-自由从这开始 嗨,我是 Martin,也叫老王.不少小伙伴,说自己是转行.自学,没有项目,今天推荐一个 Vue 实战项目 还记得 Martin 仿写过在线 Ma ...

  6. CTF_show平台 web题解 part1

    web3 题目描述: 方法一:RFI 使用url实现php远程文件包含 在服务器上构造1.txt <?php $a = "<?php eval(\$_POST['123'])?& ...

  7. Python网络编程04 /recv工作原理、展示收发问题、粘包现象

    Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...

  8. matlab中的静态变量与全局变量

    matlab中的静态变量和全局变量 1.静态变量 在matlab中,和其他语言一样,函数中的变量一把都是局部变量,也就是说,在函数调用完毕后,变量就会被释放.但是有些时候回希望上次改变的变量在下一次调 ...

  9. 【python大牛分享】python——接口自动化测试框架环境的使用

    本文总结分享介绍接口测试框架开发,环境使用python3+selenium3+unittest+ddt+requests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用 ...

  10. C# 人脸识别库 0.2

    ViewFaceCore 0.2 超简单的 C# 人脸识别库 前言: 首先谢谢大家对这个库的关注,前一篇博文得到了大家的 支持 和 Star,十分开心.本想尽快实现大家的期待的活体检测功能,但是前段时 ...