MVC学习以及研究
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));else
AddRange(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();
// Previous
sb.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));}// Next
sb.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}}