oa_mvc_easyui——分页(4)

1.数据层的编写

NewListInfoDal.cs:

GetPageEntityList方法,根据start,end取出数据 --row_number() over()函数查询

LoadEntity方法:初始化,将datatable中的每行添加到对象中

GetRecordCount方法:获取T_news表中,总的条数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Itcast.CMS.Model;

namespace Itcast.CMS.DAL
{
    public class NewListInfoDal
    {

        /// <summary>
        /// 用于分页,根据start,end 取出数据
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public List<T_News> GetPageEntityList(int start,int end)
        {
            string sql = " select * from (select row_number() over(order by id) as num, * from T_News) as t where t.num>[email protected] and t.num<[email protected] ";
            SqlParameter[] pars ={
                                      new SqlParameter("@start",SqlDbType.Int),
                                      new SqlParameter("@end",SqlDbType.Int)
                                  };
            pars[0].Value = start;
            pars[1].Value = end;

            DataTable dt = DAL.SqlHelper.SelectSqlReturnDataTable(sql, CommandType.Text, pars);

            List<T_News> newlist_list = null;
            if(dt.Rows.Count>0)
            {
                newlist_list = new List<T_News>();
                //遍历每一行添加到集合中
                T_News newlist =null;
                foreach(DataRow row in dt.Rows)
                {
                    newlist = new T_News();
                    LoadEntity(row, newlist);
                    newlist_list.Add(newlist);
                }
            }
            return newlist_list;
        }

        public void LoadEntity(DataRow row,T_News newlist)
        {
            newlist.Id = Convert.ToInt32(row["id"].ToString());
            newlist.Title = row["Title"] != DBNull.Value ? row["Title"].ToString() : string.Empty;
            newlist.Msg = row["Msg"] != DBNull.Value ? row["Msg"].ToString() : string.Empty;
            newlist.Author = row["Author"] != DBNull.Value ? row["Author"].ToString() : string.Empty;
            newlist.ImagePath = row["ImagePath"] != DBNull.Value ? row["ImagePath"].ToString() : string.Empty;
            newlist.SubDateTime = Convert.ToDateTime(row["SubDateTime"].ToString());
        }

        /// <summary>
        /// 获取T_News表中,总的条数
        /// </summary>
        /// <returns></returns>
        public int GetRecordCount()
        {
            string sql = " select count(*) from  T_News ";
            object ob = DAL.SqlHelper.selectSqlReturnObject(sql, CommandType.Text);
            ob = ob != DBNull.Value ? ob : string.Empty;
            return Convert.ToInt32(ob.ToString());
        }

    }
}

2.业务层的编写

NewListInfoService.cs

GetPageEntityList方法:返回分页每页的数据 --公式计算出当前页和每页的条数

GetPageCount方法:获取总的页数 --总的条数/每页的条数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Itcast.CMS.Model;
using Itcast.CMS.DAL;

namespace Itcast.CMS.BLL
{
    public class NewListInfoService
    {

        DAL.NewListInfoDal NewListInfo = new DAL.NewListInfoDal();

        /// <summary>
        /// 返回每页的数据
        /// </summary>
        /// <param name="PageIndex">当前页</param>
        /// <param name="PageSize">每页的条数</param>
        /// <returns></returns>
        public List<T_News> GetPageEntityList(int PageIndex,int PageSize)
        {
            //公式计算每页的第一条,最好一条
            int start = (PageIndex - 1) * PageSize + 1;
            int end = PageIndex * PageSize;
            return NewListInfo.GetPageEntityList(start, end);
        }

        /// <summary>
        /// 获取总的页数
        /// </summary>
        /// <returns></returns>
        public int GetPageCount(int PageSize)
        {
            int recordCount = NewListInfo.GetRecordCount();
            int PageCount = Convert.ToInt32(Math.Ceiling((double)recordCount / PageSize));
            return PageCount;
        }

    }
}

3.控制器中的Index方法

{

获取当前页码值,
设置条数,
总的页码数,
PageIndex范围判断,
获取分页数据,
ViewData数据绑定

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Itcast.CMS.Model;

namespace Itcast.CMS.WebApp.Controllers
{
    public class NewListController : Controller
    {
        //
        // GET: /NewList/
        BLL.NewListInfoService NewListInfo = new BLL.NewListInfoService();

        public ActionResult Index()
        {
            //获取当前页码值
            int PageIndex = Request["PageIndex"] != null ? Convert.ToInt32(Request["PageIndex"]) : 1;
            //设置条数
            int PageSize = 5;
            //总的页码数
            int PageCount = NewListInfo.GetPageCount(PageSize);
            //PageIndex范围判断
            PageIndex = PageIndex < 1 ? 1 : PageIndex;
            PageIndex = PageIndex > PageCount ? PageCount : PageIndex;
            //获取分页数据
            List<T_News> list = NewListInfo.GetPageEntityList(PageIndex, PageSize);
            //ViewData...
            ViewData["newInfoList"] = list;
            ViewData["pageIndex"] = PageIndex;
            ViewData["pageCount"] = PageCount;
            return View();
        }

    }
}

4.生产分页的页码,Common中的PageBar类中的GetPageBar方法 --生产分页的字符

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Itcast.CMS.Common
{
    public class PageBar
    {
        public static string GetPageBar(int pageIndex,int pageCount)
        {
            if (pageCount == 1)
            {
                return string.Empty;
            }
            int start = pageIndex - 5;
            start = start < 1 ? 1 : start;
            int end = start + 9;
            if (end > pageCount)
            {
                end = pageCount;
                start = end - 9 > 0 ? end - 9 : 1;
            }
            StringBuilder sb = new StringBuilder();
            if (pageIndex > 1)
            {
                sb.Append(string.Format("<a href=‘?PageIndex={0}‘>上一页</a>", pageIndex - 1));
            }
            for (int i = start; i <= end; i++)
            {
                if (i == pageIndex)
                {
                    sb.Append(i);
                }
                else
                {
                    sb.Append(string.Format("<a href=‘?PageIndex={0}‘>{0}</a>", i));
                }
            }
            if (pageIndex < pageCount)
            {
                sb.Append(string.Format("<a href=‘?PageIndex={0}‘>下一页</a>", pageIndex + 1));
            }
            return sb.ToString();
        }
    }
}

5.视图中的调用,Razor引擎视图的编写

@{
    Layout = null;
}
@using Itcast.CMS.Model
@using Itcast.CMS.Common

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <link href="~/Content/tableStyle.css" rel="stylesheet" />
    <link href="~/Content/pageBar.css" rel="stylesheet" />
</head>
<body>
    <div>
        @if(ViewData["newInfoList"]!=null)
        {
        <table width="100%">
            <tr><th>编号</th><th>标题</th><th>作者</th><th>时间</th><th>详细</th><th>删除</th></tr>
            @foreach(T_News newlist in (List<T_News>)ViewData["newInfoList"])
            {
                <tr>
                    <td>@newlist.Id</td>
                    <td>@newlist.Title</td>
                    <td>@newlist.Author</td>
                    <td>@newlist.SubDateTime</td>
                    <td>详细</td>
                    <td>删除</td>
                </tr>
            }
        </table>
    <div class="page_nav">@MvcHtmlString.Create(PageBar.GetPageBar((int)ViewData["pageIndex"], (int)ViewData["pageCount"]))</div>
        }
        else
        {
            <span>暂无数据</span>
        }
    </div>
</body>
</html>
时间: 2024-10-06 12:48:33

oa_mvc_easyui——分页(4)的相关文章

python__Django 分页

自定义分页的类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by Mona on 2017/9/20 from django.utils.safestring import mark_safe class Paginator: ''' 页码的格式依赖于bootstrap: 使用案例: from django.shortcuts import render,redirect,HttpResponse from app01.mod

ajax+分页

<!DOCTYPE html><html><head lang="zh-cn"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><meta http-equiv="X-UA-Compat

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

优化LIMIT分页

在系统中需要分页的操作通常会使用limit加上偏移量的方法实现,同时加上合适的order by 子句.如果有对应的索引,通常效率会不错,否则MySQL需要做大量的文件排序操作. 一个非常令人头疼问题就是当偏移量非常大的时候,例如可能是limit 10000,20这样的查询,这是mysql需要查询10020条然后只返回最后20条,前面的10000条记录都将被舍弃,这样的代价很高.如果所有的页面被访问的频率相同,那么这样的查询平均需要访问半个表的数据.要优化这样的查询,要么实在页面中限制分页的数量,

Ajax实现无刷新分页

注:本文中使用到的一些类库在前面文章都能找到源代码,我会在文中指明链接所在,为了缩短文章篇幅,由此带来的阅读不便,敬请谅解. 本文讲解 Ajax 实现无刷新分页.实现原理.代码展示.代码下载. 这里需要说明一些知识: 1.Ajax 无刷新页面的好处:提供良好的客户体验,通过 Ajax 在后台从数据库中取得数据并展示,取缔了等待加载页面而出现的空白状态: 2.那么,Ajax 无刷新页面是运行在动态页面(.PHP)?还是静态页面(.html/.htm/.shtml)?答案是:静态页面: 3.实现原理

关于分页SQL的小总结

findPage 和findPageTotal条件分页中的条件 较为复杂点的关联查询 有取别名的 <select id="findPage" resultMap="MinOrderInfo" parameterType="map"> SELECT o.*,w.name buyName,w.MOBILE buyMobile,aa.name sellName,aa.MOBILE sellMobile,rs.CAR_BRAND_NAME c

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

TODO:数据库优化之分页

本文的例子是以MongoDB数据库为准,其它数据库各位也可以举一反三进行优化. 在MongoDB中分页使用 a.skip(n)跳过前n个匹配的文档: b.limit(m)返回m个结果,要是匹配的结果不到m个,则返回匹配数据量的结果,m是指定上限数量,而不是下限数量: c.sort({"name": 1,"address":-1}),1表示升序,-1表示降序. 使用skip跳过少量的文档还可以.但是数据量非常多的话,skip就会变得非常慢,每个数据库都会有这种情况,所

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add