ASP.NET.MVC4 高级编程学习资料
25M PDF 507页 进入下载 点击Professional.ASP.NET.MVC
andrewdavey-NotFoundMvc 链接
martijnboland-MvcPaging 链接

IPagedList.cs
using System.Collections.Generic;namespace MvcPaging{public interface IPagedList{int PageCount { get; }int TotalItemCount { get; }int PageIndex { get; }int PageNumber { get; }int PageSize { get; }bool HasPreviousPage { get; }bool HasNextPage { get; }bool IsFirstPage { get; }bool IsLastPage { get; }int ItemStart { get; }int ItemEnd { get; }}public interface IPagedList<T> : IPagedList, IList<T>{}}
PagedList.cs
using System;using System.Collections.Generic;using System.Linq;namespace MvcPaging{public class PagedList<T> : List<T>, IPagedList<T>{public PagedList(IEnumerable<T> source, int index, int pageSize, int? totalCount = null): this(source.AsQueryable(), index, pageSize, totalCount){}public PagedList(IQueryable<T> source, int index, int pageSize, int? totalCount = null){if (index < 0)throw new ArgumentOutOfRangeException("index", "Value can not be below 0.");if (pageSize < 1)throw new ArgumentOutOfRangeException("pageSize", "Value can not be less than 1.");if (source == null)source = new List<T>().AsQueryable();var realTotalCount = source.Count();PageSize = pageSize;PageIndex = index;TotalItemCount = totalCount.HasValue ? totalCount.Value : realTotalCount;PageCount = TotalItemCount > 0 ? (int)Math.Ceiling(TotalItemCount / (double)PageSize) : 0;HasPreviousPage = (PageIndex > 0);HasNextPage = (PageIndex < (PageCount - 1));IsFirstPage = (PageIndex <= 0);IsLastPage = (PageIndex >= (PageCount - 1));ItemStart = PageIndex * PageSize + 1;ItemEnd = Math.Min(PageIndex * PageSize + PageSize, TotalItemCount);if (TotalItemCount <= 0)return;var realTotalPages = (int)Math.Ceiling(realTotalCount / (double)PageSize);if (realTotalCount < TotalItemCount && realTotalPages <= PageIndex)AddRange(source.Skip((realTotalPages - 1) * PageSize).Take(PageSize));elseAddRange(source.Skip(PageIndex * PageSize).Take(PageSize));}#region IPagedList Memberspublic int PageCount { get; private set; }public int TotalItemCount { get; private set; }public int PageIndex { get; private set; }public int PageNumber { get { return PageIndex + 1; } }public int PageSize { get; private set; }public bool HasPreviousPage { get; private set; }public bool HasNextPage { get; private set; }public bool IsFirstPage { get; private set; }public bool IsLastPage { get; private set; }public int ItemStart { get; private set; }public int ItemEnd { get; private set; }#endregion}}
Pager.cs
using System;using System.Text;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;using System.Web.Routing;namespace MvcPaging{public class Pager{private ViewContext viewContext;private readonly int pageSize;private readonly int currentPage;private readonly int totalItemCount;private readonly RouteValueDictionary linkWithoutPageValuesDictionary;private readonly AjaxOptions ajaxOptions;public Pager(ViewContext viewContext, int pageSize, int currentPage, int totalItemCount, RouteValueDictionary valuesDictionary, AjaxOptions ajaxOptions){this.viewContext = viewContext;this.pageSize = pageSize;this.currentPage = currentPage;this.totalItemCount = totalItemCount;this.linkWithoutPageValuesDictionary = valuesDictionary;this.ajaxOptions = ajaxOptions;}public HtmlString RenderHtml(){var pageCount = (int)Math.Ceiling(totalItemCount / (double)pageSize);const int nrOfPagesToDisplay = 10;var sb = new StringBuilder();// Previoussb.Append(currentPage > 1 ? GeneratePageLink("<", currentPage - 1) : "<span class=\"disabled\"><</span>");var start = 1;var end = pageCount;if (pageCount > nrOfPagesToDisplay){var middle = (int)Math.Ceiling(nrOfPagesToDisplay / 2d) - 1;var below = (currentPage - middle);var above = (currentPage + middle);if (below < 4){above = nrOfPagesToDisplay;below = 1;}else if (above > (pageCount - 4)){above = pageCount;below = (pageCount - nrOfPagesToDisplay + 1);}start = below;end = above;}if (start > 1){sb.Append(GeneratePageLink("1", 1));if (start > 3){sb.Append(GeneratePageLink("2", 2));}if (start > 2){sb.Append("...");}}for (var i = start; i <= end; i++){if (i == currentPage || (currentPage <= 0 && i == 0)){sb.AppendFormat("<span class=\"current\">{0}</span>", i);}else{sb.Append(GeneratePageLink(i.ToString(), i));}}if (end < pageCount){if (end < pageCount - 1){sb.Append("...");}if (pageCount - 2 > end){sb.Append(GeneratePageLink((pageCount - 1).ToString(), pageCount - 1));}sb.Append(GeneratePageLink(pageCount.ToString(), pageCount));}// Nextsb.Append(currentPage < pageCount ? GeneratePageLink(">", (currentPage + 1)) : "<span class=\"disabled\">></span>");return new HtmlString(sb.ToString());}private string GeneratePageLink(string linkText, int pageNumber){var routeDataValues = viewContext.RequestContext.RouteData.Values;RouteValueDictionary pageLinkValueDictionary;// Avoid canonical errors when page count is equal to 1.if (pageNumber == 1){pageLinkValueDictionary = new RouteValueDictionary(this.linkWithoutPageValuesDictionary);if (routeDataValues.ContainsKey("page")){routeDataValues.Remove("page");}}else{pageLinkValueDictionary = new RouteValueDictionary(this.linkWithoutPageValuesDictionary) { { "page", pageNumber } };}// To be sure we get the right route, ensure the controller and action are specified.if (!pageLinkValueDictionary.ContainsKey("controller") && routeDataValues.ContainsKey("controller")){pageLinkValueDictionary.Add("controller", routeDataValues["controller"]);}if (!pageLinkValueDictionary.ContainsKey("action") && routeDataValues.ContainsKey("action")){pageLinkValueDictionary.Add("action", routeDataValues["action"]);}// 'Render' virtual path.var virtualPathForArea = RouteTable.Routes.GetVirtualPathForArea(viewContext.RequestContext, pageLinkValueDictionary);if (virtualPathForArea == null)return null;var stringBuilder = new StringBuilder("<a");if (ajaxOptions != null)foreach (var ajaxOption in ajaxOptions.ToUnobtrusiveHtmlAttributes())stringBuilder.AppendFormat(" {0}=\"{1}\"", ajaxOption.Key, ajaxOption.Value);stringBuilder.AppendFormat(" href=\"{0}\">{1}</a>", virtualPathForArea.VirtualPath, linkText);return stringBuilder.ToString();}}}
PagingExtensions.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Mvc.Ajax;using System.Web.Routing;namespace MvcPaging{public static class PagingExtensions{#region AjaxHelper extensionspublic static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, AjaxOptions ajaxOptions){return Pager(ajaxHelper, pageSize, currentPage, totalItemCount, null, null, ajaxOptions);}public static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, string actionName, AjaxOptions ajaxOptions){return Pager(ajaxHelper, pageSize, currentPage, totalItemCount, actionName, null, ajaxOptions);}public static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, object values, AjaxOptions ajaxOptions){return Pager(ajaxHelper, pageSize, currentPage, totalItemCount, null, new RouteValueDictionary(values), ajaxOptions);}public static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, string actionName, object values, AjaxOptions ajaxOptions){return Pager(ajaxHelper, pageSize, currentPage, totalItemCount, actionName, new RouteValueDictionary(values), ajaxOptions);}public static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, RouteValueDictionary valuesDictionary, AjaxOptions ajaxOptions){return Pager(ajaxHelper, pageSize, currentPage, totalItemCount, null, valuesDictionary, ajaxOptions);}public static HtmlString Pager(this AjaxHelper ajaxHelper, int pageSize, int currentPage, int totalItemCount, string actionName, RouteValueDictionary valuesDictionary, AjaxOptions ajaxOptions){if (valuesDictionary == null){valuesDictionary = new RouteValueDictionary();}if (actionName != null){if (valuesDictionary.ContainsKey("action")){throw new ArgumentException("The valuesDictionary already contains an action.", "actionName");}valuesDictionary.Add("action", actionName);}var pager = new Pager(ajaxHelper.ViewContext, pageSize, currentPage, totalItemCount, valuesDictionary, ajaxOptions);return pager.RenderHtml();}#endregion#region HtmlHelper extensionspublic static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount){return Pager(htmlHelper, pageSize, currentPage, totalItemCount, null, null);}public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, string actionName){return Pager(htmlHelper, pageSize, currentPage, totalItemCount, actionName, null);}public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, object values){return Pager(htmlHelper, pageSize, currentPage, totalItemCount, null, new RouteValueDictionary(values));}public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, string actionName, object values){return Pager(htmlHelper, pageSize, currentPage, totalItemCount, actionName, new RouteValueDictionary(values));}public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, RouteValueDictionary valuesDictionary){return Pager(htmlHelper, pageSize, currentPage, totalItemCount, null, valuesDictionary);}public static HtmlString Pager(this HtmlHelper htmlHelper, int pageSize, int currentPage, int totalItemCount, string actionName, RouteValueDictionary valuesDictionary){if (valuesDictionary == null){valuesDictionary = new RouteValueDictionary();}if (actionName != null){if (valuesDictionary.ContainsKey("action")){throw new ArgumentException("The valuesDictionary already contains an action.", "actionName");}valuesDictionary.Add("action", actionName);}var pager = new Pager(htmlHelper.ViewContext, pageSize, currentPage, totalItemCount, valuesDictionary, null);return pager.RenderHtml();}#endregion#region IQueryable<T> extensionspublic static IPagedList<T> ToPagedList<T>(this IQueryable<T> source, int pageIndex, int pageSize, int? totalCount = null){return new PagedList<T>(source, pageIndex, pageSize, totalCount);}#endregion#region IEnumerable<T> extensionspublic static IPagedList<T> ToPagedList<T>(this IEnumerable<T> source, int pageIndex, int pageSize, int? totalCount = null){return new PagedList<T>(source, pageIndex, pageSize, totalCount);}#endregion}}