• asp.net中条件查询+分页


    大家好,我是雄雄,欢迎关注公众号:雄雄的小课堂。

    今天,分享的是asp.net中条件查询+分页的小案例。

    如下图所示:

    在这里插入图片描述

    各个功能模块均已标注,先大致介绍一下业务。

    1. 点击左侧图书类别,根绝类别编号在右侧查询显示该类别中的所有图书列表(分页查询)

    2. 下拉排序方式,可以根据价格排序和出版日期排序。当下拉列表改变值时,图书列表按照排序方式改变。

    3. 右上角显示为分页信息,左箭头表示上一页,右箭头表示下一页。

    数据访问层(DAL):

    1.需要根据“类别编号”“当前页”“页大小”以及“排序方式”查询图书列表,代码如下:

    //  1.当前页,页大小,类别,排序依据--》得到数据集合
           public List<Books> GetPageBooks(int currPage, int pageSize, string orderBy, int cateId)
           {
               string sql = "select top " + pageSize + " * from Books where id not in (select top " + (currPage - 1) * pageSize + " id from Books where CategoryId = " + cateId + " order by  " + orderBy + ") and CategoryId = " + cateId + " order by  " + orderBy + "";
               List<Books> bList = new List<Books>();
               SqlDataReader dr = SqlHelper.ExecuteReader(sql, null);
               while (dr.Read())
               {
                   Books b = new Books();
                   b.Id = Convert.ToInt32(dr[0]);
                   b.Title = dr[1].ToString();
                   b.Author = dr[2].ToString();
                   b.PublisherId = Convert.ToInt32(dr[3].ToString());
                   b.PublishDate = Convert.ToDateTime(dr[4].ToString());
                   b.ISBN = dr[5].ToString();
                   b.UnitPrice = Convert.ToDouble(dr[6].ToString());
                   b.ContentDescription = dr[5].ToString();
                   b.CategoryId = Convert.ToInt32(dr[0]);
                   b.Clicks = Convert.ToInt32(dr[0]);
                   bList.Add(b);
               }
               return bList;
           }
    

    2.需要根据类别查询总记录数,从而在前台计算总页数,代码如下:

    //总记录数
           //类别
           public int GetTotalNum(int cateId)
           {
               int rel = 0;
               string sql = "select count(*) from Books where CategoryId = @CategoryId";
               SqlParameter[] param = { new SqlParameter("@CategoryId", cateId) };
               rel = Convert.ToInt32(SqlHelper.ExecuteScalar(sql, param));
               return rel;
           }
    

    业务逻辑层(BLL):

    将DAL的两个方法可以结合起来,将数据集合(图书列表)和总记录数(根据类别查询)带出去,在控制器中获取,代码如下:

    public List<Books> GetPageList(int currPage, int pageSize, string orderBy, int cateId, out int totalNum)
           {
               totalNum = bs.GetTotalNum(cateId);
               return bs.GetPageBooks(currPage, pageSize, orderBy, cateId);
           }
    

    前台业务分析:

    点击类别,展示图书列表比较简单,这里一带而过,不细说,代码如下(利用了内联视图):

    <%
       List<BookShop.Models.Categories> cateList = ViewData["cateList"] as List<BookShop.Models.Categories>;
       foreach(BookShop.Models.Categories cate in cateList){
           
           %>
                       <li><%=Html.ActionLink(cate.Name, "BooksList", "Books", new { id=cate.Id}, null)%></li>
    <%
           
       }
       
        %>
    

    图书列表页:图书列表通过强类型视图遍历展示。

    接下来,我们可以将当前页、排序方式放在form表单中往控制器中传值(不放也可以,利用jQuery直接获取值,稍微麻烦点),当改变下拉列表的值时,提交form表单,form表单的代码如下:

    <form action="<%=Url.Action("BooksList", "Books", new  {id=ViewData["cateid"]})%>" method="post" id="mainForm">
       <input type="hidden" name="orderBy"  value="<% =ViewData["orderBy"] %>"/>
       <input type="hidden" name="currPage" value="<% =ViewData["currPage"] %>"/>
    
    </form>
    

    相关jquery代码如下:

    <script type="text/javascript">
           //jQuery代码
           $(function () {
               var orderBy = $("input[name='orderBy']").val();
               $("select[name='list_type']").val(orderBy);
               $("select[name='list_type']").change(function () {
                   $("input[name='orderBy']").val($(this).val());
                   $("input[name='currPage']").val(1);
                   $("#mainForm").submit();
               });
               
           });
    
      </script>
    

    上一页:

    点击上一页时,获取表单中当前页的值,然后进行判断,如果当前页是第一页,则无序操作,否则当前也减1,最后提交表单。

    //上一页
               $("#turn_pre").click(function () {
                   //当前页减1
                   var currPage = $("input[name='currPage']").val();
                   if (currPage > 1) {
                           currPage = currPage-1;
                   }
                   $("input[name='currPage']").val(currPage);
                   $("#mainForm").submit();
               });
    

    下一页:

    点击下一页时,获取表单中当前页的值,还需要获取控制器往页面传递的总页数,然后进行判断,如果当前页等于总页数,则无序操作,否则当前页加1,最后提交表单。

     //下一页
               $("#turn_next").click(function () {
                   //当前页减1
                   var currPage = $("input[name='currPage']").val();
                   var totalPage = <%=ViewData["totalPage"]%>;
                  
                   if(totalPage!=currPage){
                       currPage = parseInt(currPage) + 1;
                   }
                   $("input[name='currPage']").val(currPage);
                   $("#mainForm").submit();
               });
    

    控制器(BooksController):

    首先,根据前台页面的需求,我们可以知悉,控制器的动作方法中,最少需要【当前页】【页大小】【类别编号】【排序方式】几个值,【当前页】和【排序方式】我们可以直接从form表单中获取,【类别编号】可以从路由中获取,【页大小】直接写成死的就可以,代码如下:

     public ActionResult BooksList() {
                //类别号
                int cateid =Convert.ToInt32(RouteData.Values["id"]);
                //排序依据
                string orderBy = Request.Form["orderBy"] == null ? "PublishDate" : Request.Form["orderBy"];
                //当前页
                int currPage = Request.Form["currPage"] == null ? 1 : Convert.ToInt32(Request.Form["currPage"]);
                //页大小
                int pageSize = 5;
                int totalNum = 0;
                List<Books> bList = bm.GetPageList(currPage, pageSize, orderBy, cateid, out  totalNum);
                ViewData["currPage"] = currPage;
                
                ViewData["orderBy"] = orderBy;
                ViewData["cateid"] = cateid;
                int totalPage = totalNum % pageSize == 0 ? totalNum / pageSize : (totalNum / pageSize) + 1;
                ViewData["totalPage"] = totalPage;
                return View(bList);
            }
    
    
    
  • 相关阅读:
    andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
    MTK Camera驱动移植
    云计算VDI相关职位招聘
    Android内存泄露之开篇
    关于ping以及TTL的分析
    STL之关联容器的映射底层
    STL非变易算法
    自己主动更新 -- 版本比較(2)
    activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
    合并多个文本文件方法
  • 原文地址:https://www.cnblogs.com/a1111/p/14877289.html
Copyright © 2020-2023  润新知