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.

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

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

     
    
    
    
  • 相关阅读:
    tomcat加载项目原理解惑
    英语口语大全
    ubuntu中wubi正在下载ubuntu11.04desktopi386.iso
    Strust2获得session和request
    字符串转成对象
    DevExpress控件使用
    DevExpress控件之GridControl控件(控件篇)
    ASP.NET AJAX + JSON 实现对象调用
    WinForm窗体之间交互的一些方法[转]
    barmanager设置
  • 原文地址:https://www.cnblogs.com/zhengwei-cq/p/13373330.html
Copyright © 2011-2022 走看看