zoukankan      html  css  js  c++  java
  • 基于jqgrid + ashx + nhibernate的分页

    因为我目前运维的是一个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,
                 '95%',
                rowNum: 10,
                rowList: [10, 100, 500, 1000],
                colNames: columns,
                auto true,
                hoverrows: false,
                colModel: [
                    { name: 'Id', hidden: true, index: 'Id',  40, key: true },
                    { name: 'Name', index: 'Name',  40, align: "center" },
                    { name: 'ExamType', index: 'ExamType',  100, align: "center" },
                    { name: 'Score', index: 'Score',  30, align: "center" },
                    { name: 'QuerySite', index: 'QuerySite',  120, align: "center" },
                    { name: 'ExamTime', index: 'ExamTime',  60, formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },
                    { name: 'CreatedTime', index: 'CreatedTime',  60, formatter: "date", formatoptions: { srcformat: 'Y-m-d ', newformat: 'Y-m-d ' }, align: "center" },
                    { name: 'StatusText', index: 'StatusText',  50, align: "center" },
                    { name: 'Remark', index: 'Remark',  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.

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

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

     
    
    
    
  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/zhengwei-cq/p/13373330.html
Copyright © 2011-2022 走看看