MVC分页详解(包括整个流程步骤,代码与注解)
来源:互联网 发布:多益网络并购2017 编辑:程序博客网 时间:2024/06/05 03:22
1、首先写一个Model(分页模型)MvcPagerInfo.cs(可放入AppCode中)
using System;using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;using System.Linq;using System.Web.Mvc;using System.Web;using System.Text;namespace community{ public class MvcPagerInfo { private int _pageIndex; public int PageIndex { get { return _pageIndex; } set { _pageIndex = value; } } private int _pageSize; public int PageSize { get { return _pageSize; } set { _pageSize = value; } } private int _recordCount; public int RecordCount { get { return _recordCount; } set { _recordCount = value; } } /// <summary> /// 当前状态下,最小的页码 /// </summary> private int _lowPageNum; public int LowPageNum { get { return _lowPageNum; } } /// <summary> /// 当前状态下,最大的页码 /// </summary> private int _highPageNum; public int HighPageNum { get { return _highPageNum; } } /// <summary> /// 一次性能显示多少页数 /// </summary> private int _maxPageNum; public int MaxPageNum { get { return _maxPageNum; } set { _maxPageNum = value; } } private bool _showPageInfo = true; public bool ShowPageInfo { get { return _showPageInfo; } set { _showPageInfo = value; } } /// <summary> /// 页数 /// </summary> private int _pageCount; public int PageCount { get { return _pageCount; } } /// <summary> /// 当前路径 /// </summary> private string path; public string Path { get { return path; } set { path = value; } } private NameValueCollection queries; public MvcPagerInfo() { } public void Compose() { path = HttpContext.Current.Request.Url.AbsolutePath; queries = new NameValueCollection(StringComparer.OrdinalIgnoreCase); foreach (string key in HttpContext.Current.Request.QueryString.AllKeys) { if (key == null) continue; if (key.ToLower() != "page") queries.Add(key, HttpContext.Current.Request.QueryString[key]); } if (_recordCount == 0) _pageCount = 1; else _pageCount = (_recordCount % _pageSize == 0) ? (_recordCount / _pageSize) : ((_recordCount / _pageSize) + 1); if (_maxPageNum >= _pageCount)//如果页数小于等于最大页面显示 { _lowPageNum = 1; _highPageNum = _pageCount; } else { int lhalf, rhalf; if (_maxPageNum % 2 == 0) { lhalf = _maxPageNum / 2 - 1; rhalf = _maxPageNum / 2; } else lhalf = rhalf = _maxPageNum / 2; _lowPageNum = (_pageIndex - lhalf > 0) ? (_pageIndex - lhalf) : 1; _highPageNum = (_pageIndex + rhalf > _pageCount) ? _pageCount : (_pageIndex + rhalf < _maxPageNum ? _maxPageNum : _pageIndex + rhalf); if (_lowPageNum > 1 && _highPageNum - _lowPageNum < _maxPageNum - 1)//校正 { _lowPageNum = _highPageNum - _maxPageNum + 1; } } } public string GetFirstUrl() { return GenerateUrl(1); } public string GetLastUrl() { return GenerateUrl(_pageCount); } public string GetNextUrl() { return GenerateUrl(_pageIndex + 1); } public string GetPrevUrl() { return GenerateUrl(_pageIndex - 1); } public string GetCurrentUrl() { return GenerateUrl(_pageIndex); } public string GetUrl(int page) { return GenerateUrl(page); } private string GenerateUrl(int pageIndex) { StringBuilder sb = new StringBuilder(); foreach (string key in queries.AllKeys) { sb.Append(key + "=" + System.Web.HttpContext.Current.Server.UrlEncode(queries[key]) + "&"); } sb.Append("page=" + pageIndex); return path + "?" + sb.ToString(); } public string GetPageInfo() { if (_showPageInfo) { string info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条"; int startCurrentCount = (_pageIndex - 1) * _pageSize + 1; int endCurrentCount = _pageIndex * _pageSize; if (startCurrentCount > _recordCount) startCurrentCount = _recordCount; if (endCurrentCount > _recordCount) endCurrentCount = _recordCount; info = string.Format(info, _recordCount.ToString(), _pageIndex.ToString(), _pageCount.ToString(), _pageSize.ToString(), startCurrentCount.ToString(), endCurrentCount.ToString()); return info; } else return ""; } }}
2、在控制器公用方法中添加分页方法BaseController.cs
#region fs 分页 protected int GetPageSize() { if (string.IsNullOrEmpty(Request.QueryString["pagesize"])) return 10; else return Convert.ToInt32(Request.QueryString["pagesize"]); } protected int GetPageIndex() { if (string.IsNullOrEmpty(Request.QueryString["page"])) { if (string.IsNullOrEmpty(Request.QueryString["pageindex"])) return 1; else return Convert.ToInt32(Request.QueryString["pageindex"]); } else return Convert.ToInt32(Request.QueryString["page"]); } protected void AddPager(int recordCount, int PageSize) { AddPager(recordCount, false, PageSize); } protected void AddPager(int recordCount) { AddPager(recordCount, false); } protected void AddPager(int recordCount, bool showpageInfo) { AddPager(recordCount, showpageInfo, GetPageSize()); } protected void AddPager(int recordCount, bool showpageInfo, int pageSize) { MvcPagerInfo pageinfo = new MvcPagerInfo(); pageinfo.PageIndex = GetPageIndex(); pageinfo.PageSize = pageSize; pageinfo.RecordCount = recordCount; pageinfo.MaxPageNum = 10; pageinfo.Compose(); pageinfo.ShowPageInfo = showpageInfo; ViewData.Add("pager", pageinfo); } /// <summary> /// 是否列表要获取所有数据 /// </summary> /// <returns></returns> protected bool IsGetTotalData() { string total = Request.QueryString["total"]; if (total == "1" || this.GetPageSize() <= 0) return true; else return false; } /// <summary> /// 保存访问地址 /// </summary> /// <param name="pageName"></param> protected void SaveCurrentUrl(string pageName) { Session[pageName] = Request.Url.ToString(); } /// <summary> /// 获取访问地址 /// </summary> /// <param name="pageName"></param> protected string GetLastSavedUrl(string pageName) { if (Session[pageName] != null) return Session[pageName].ToString(); else return pageName; } #endregion
3、写一个一般处理程序Pager.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcPagerInfo>" %><%@ Import Namespace="community" %><% string firstPage; string prevPage; string nextPage; string lastPage; // string currentPage; if (Model != null && Model.RecordCount != 0) { firstPage = "<a id='firstPage' href=\"" + Model.GetFirstUrl() + "\">首页</a>"; lastPage = "<a href=\"" + Model.GetLastUrl() + "\">末页</a>"; if (Model.PageIndex == 1 || Model.PageCount < Model.PageIndex) { prevPage = "<span>上一页</span>"; } else { prevPage = "<a href=\"" + Model.GetPrevUrl() + "\">上一页</a>"; } if (Model.PageCount <= Model.PageIndex) { nextPage = "<span>下一页</span>"; } else { nextPage = "<a href=\"" + Model.GetNextUrl() + "\">下一页</a>"; } Response.Write("<span>" + Model.GetPageInfo() + "</span>"); Response.Write(firstPage); Response.Write(prevPage); for (int i = Model.LowPageNum; i <= Model.HighPageNum; i++) { string css = ""; if (Model.PageIndex == i) css = " class=\"currentPage\""; Response.Write("<a href=\"" + Model.GetUrl(i) + "\"" + css + ">" + i + "</a>"); } if (Model.HighPageNum < Model.PageCount) Response.Write("<a href=\"" + Model.GetUrl(Model.HighPageNum + 1) + "\">...</a>"); Response.Write(nextPage); Response.Write(lastPage); } %>
4、分页模板 _Pager.cshtml(View/Shared中)
<div id="pagelist" class="pagelist"> @{ Html.RenderPartial("Pager", ViewData["pager"]);} <input type='text' style='width:30px' onkeyup='this.value=this.value.replace(/[^1-9]\d*$/,"")' value='@Request.QueryString["page"]' name='pageId' id='pageId'/>页 <!-- 获取文本框的值作为跳转路径参数<a href="javascript:;" onclick="location ='?page='+document.getElementById('pageId').value;">跳 转</a> --> <a href="javascript:;" onclick="url()">跳 转</a></div><script type="text/javascript"> window.onload = function () { if (!document.getElementById('firstPage')) { document.getElementById("pagelist").style.display = "none"; } if (document.getElementById('pageId').value == "") { document.getElementById('pageId').value = 1; } } function url() { var str = document.getElementById("firstPage").getAttribute("href"); str=str.replace("page=1", "page=" + document.getElementById('pageId').value); location.href = str; }</script>
5、View(视图),以后分页调用这个模板就好了
@{Html.RenderPartial("_Pager");}<!--将其放入需要分页的位置-->
6、CSS,分页在右下角显示
/*分页*/.pagelist { text-align:right; padding:5px; color:#000; cursor:default;height: 31px;}.pagelist a:link,.pagelist a:visited, .pagelist span{padding: 1px 3px 1px 3px;margin: 2px;text-decoration: none;min-width:12px;text-align:center;color:#2b5591;}.pagelist a:hover{ background-color:#dedede}.pagelist span{ color:#999}.pagelist .currentPage{ font-weight:bold; color:red;}.pagelist .txt{ width:25px}
7、Controller(控制器中)
public ActionResult View() { int total = 0; int pageIndex = GetPageIndex();//当前页码 int pageSize = GetPageSize();//使用默认,每页10条数据 var model = BlogService.LoadLastestBrieves(pageSize, pageIndex, out total);//调用的方法 int totalCount = BlogService.TotalBlogs();//获取分页时数据总条数 AddPager(totalCount, true, pageSize);//分页时每页显示10条数据,页面显示“info = "共{0}条 第{4}条-{5}条 第{1}页/共{2}页 每页{3}条"",false则隐藏 SaveCurrentUrl("~/Admin/View");//保存当前路径,在AdminController中View下 return View(model); }
8、单纯SQL语句分页,当然你也可以用存储过程进行分页
select * from (select *,ROW_NUMBER() over(order by ID) as rn from UserInfo where ...) where rn between @PageSize*(@PageIndex-1)+1 and @PageSize*@PageIndex
9、结果(http://localhost:XXXX/Admin/View中)
默认结果:(AddPager(totalCount))详细结果:(AddPager(totalCount,true))
一个人的牛逼不如一群人的傻逼
- MVC分页详解(包括整个流程步骤,代码与注解)
- spring MVC 整个流程
- spring MVC框架的配置流程(代码详解)
- spring mvc源码分析(整个流程)
- jsp分页显示的代码与详细步骤 复制代码
- Spring mvc+struts2+Hibernate整合实例代码(注解详解)
- Spring mvc注解详解
- Spring MVC 注解详解
- spring mvc注解详解
- spring mvc注解详解
- springmvc、mybatis分页+pagehelper的使用(包括页面代码)
- jsp分页显示的代码与详细步骤
- RIL层代码分析--拨号整个流程
- servlet代码分析-整个执行流程
- servlet代码分析-整个执行流程
- 使用struts+jsp整个流程 +配置详解
- mvc流程详解
- 关于Spring MVC的详细步骤(包括web.xml;applicationContext.xml;dispatcher-servlet.xml)
- 比较一下 看看自己掌握了多少SQL快捷键
- Unix 和 Linux 双机热备 概念
- S5PV210(TQ210)学习笔记——Nand配置
- 关于ping不通的可能原因
- centos下git源码安装
- MVC分页详解(包括整个流程步骤,代码与注解)
- js版俄罗斯方块
- 实例讲解如何实现互联网上数据库的安全
- start with connect by prior的简单小示例
- Java Jdbc减少与Oracle之间交互提升批量处理性能,到底该如何优化才好?
- Marvell将押注中国移动的LTE计划
- “wps文字”行末数字换行出现分割问题
- Log4j 配置文件(log4j.properties)的所在路径问题
- android 制作.9.png图片制作