【分享】一个Asp.net mvc下的分页控件MvcPagerX
分页再平常不过的需求,其实也很简单完全可以写百行以内的代码扩展到HtmlHelper上实现,但是为了扩展性,我稍微(这所以是稍微,是因为本人只稍微了解,还不敢说用得很熟练)用了点面向对象的思想对这个分页控件进行了设计,当然设计之前也参考了一些盆友的作品。吸取了一些思想的精华,下面就讲讲怎么设计以及为什么要这么设计
接口部分:
using System.Collections.Generic;
namespace MvcPagerx
{
/// <summary>
/// 分页接口
/// </summary>
public interface IPageAble
{
/// <summary>
/// 一个按钮或者少于一个按钮的时候
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnLessThanOnePage();
/// <summary>
/// 第一页时
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenFrist();
/// <summary>
/// 最后一页时
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenLast();
/// <summary>
/// 默认情况
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenDefault();
/// <summary>
/// 分页设置
/// </summary>
PagerSettings PagerSetting { get; set; }
}
}
namespace MvcPagerx
{
/// <summary>
/// 分页接口
/// </summary>
public interface IPageAble
{
/// <summary>
/// 一个按钮或者少于一个按钮的时候
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnLessThanOnePage();
/// <summary>
/// 第一页时
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenFrist();
/// <summary>
/// 最后一页时
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenLast();
/// <summary>
/// 默认情况
/// </summary>
/// <returns></returns>
IList<PageButton> GetBtnWhenDefault();
/// <summary>
/// 分页设置
/// </summary>
PagerSettings PagerSetting { get; set; }
}
}
此接口主要标明实现类可以被分页,在需要分页的各种情况给出反馈,有
一个按钮或者少于一个按钮的时候
第一页时
最后一页时
默认情况
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
namespace MvcPagerx
{
/// <summary>
/// 能够根据分页按钮生成HTML接口
/// </summary>
public interface IGeneratePagerHtmlAble
{
/// <summary>
/// PagerSetting
/// </summary>
PagerSettings PagerSetting { get; set; }
/// <summary>
/// Generate
/// </summary>
/// <param name="pageButtons"></param>
/// <returns></returns>
MvcHtmlString Generate(IList<PageButton> pageButtons);
Func<RequestContext, string, int, string> UrlCallback { set; }
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
namespace MvcPagerx
{
/// <summary>
/// 能够根据分页按钮生成HTML接口
/// </summary>
public interface IGeneratePagerHtmlAble
{
/// <summary>
/// PagerSetting
/// </summary>
PagerSettings PagerSetting { get; set; }
/// <summary>
/// Generate
/// </summary>
/// <param name="pageButtons"></param>
/// <returns></returns>
MvcHtmlString Generate(IList<PageButton> pageButtons);
Func<RequestContext, string, int, string> UrlCallback { set; }
}
}
这个接口呢用于标明实现类具有生成HTML代码的功能,在这里我们可以看到,传入的参数是IList<PageButton>,返回的是MvcHtmlString,为什么要传入IList<PageButton>,因为这里给这个接口定位很明确就是只是完成将PageButton这种实体列表转换为相应的HTML代码就可以了。那么谁负责生成IList<PageButton>呢,看看上面的IpageAble接口便知道,那就是实现了IpageAble的类,请看下面
实现类部分:
using System.Collections.Generic;
using System.Linq;
using System.Text;
{
/// <summary>
/// 普通的分页类
/// </summary>
public class NormalPageProc : IPageAble
{
#region fields
private int _StartPageIndex;
private int _EndPageIndex;
public PagerSettings PagerSetting { get; set; }
#endregion
#region Private Method
private void Init()
{
_StartPageIndex = PagerSetting.CurrentPageIndex - (PagerSetting.NumericPagerCount / 2);
if (_StartPageIndex + PagerSetting.NumericPagerCount > PagerSetting.PageCount)
_StartPageIndex = PagerSetting.PageCount + 1 - PagerSetting.NumericPagerCount;
if (_StartPageIndex < 1)
_StartPageIndex = 1;
_EndPageIndex = _StartPageIndex + PagerSetting.NumericPagerCount - 1;
if (_EndPageIndex > PagerSetting.PageCount)
_EndPageIndex = PagerSetting.PageCount;
}
private void AddFristButton(IList<PageButton> pageBtnList)
{
PageButton fristitem = new PageButton(PagerSetting.FirstPageText, 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.FirstPageButton);
pageBtnList.Add(fristitem);
}
private void AddPrevButton(IList<PageButton> pageBtnList)
{
var previtem = new PageButton(PagerSetting.PrevPageText, PagerSetting.CurrentPageIndex - 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.PrevPageButton);
pageBtnList.Add(previtem);
}
private void AddMoreButtonBefore(IList<PageButton> pageBtnList)
{
if (_StartPageIndex > 1 && PagerSetting.ShowMorePagerItems)
{
var index = _StartPageIndex - 1;
if (index < 1) index = 1;
PageButton item = new PageButton(PagerSetting.MorePageText, index, false, PageButtonType.MorePageButton);
pageBtnList.Add(item);
}
}
private void AddNumberButton(IList<PageButton> pageBtnList)
{
for (var pageIndex = _StartPageIndex; pageIndex <= _EndPageIndex; pageIndex++)
{
var text = pageIndex.ToString();
if (pageIndex == PagerSetting.CurrentPageIndex && !string.IsNullOrEmpty(PagerSetting.CurrentPageNumberFormatString))
text = String.Format(PagerSetting.CurrentPageNumberFormatString, text);
else if (!string.IsNullOrEmpty(PagerSetting.PageNumberFormatString))
text = String.Format(PagerSetting.PageNumberFormatString, text);
var item = new PageButton(text, pageIndex, false, PageButtonType.NumericPageButton);
pageBtnList.Add(item);
}
}
private void AddMoreButtonAfter(IList<PageButton> pageBtnList)
{
if (_EndPageIndex < PagerSetting.PageCount)
{
var index = _StartPageIndex + PagerSetting.NumericPagerCount;
if (index > PagerSetting.PageCount) index = PagerSetting.PageCount;
var item = new PageButton(PagerSetting.MorePageText, index, false, PageButtonType.MorePageButton);
pageBtnList.Add(item);
}
}
private void AddNextButton(IList<PageButton> pageBtnList)
{
var nextitem = new PageButton(PagerSetting.NextPageText, PagerSetting.CurrentPageIndex + 1, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.NextPageButton);
pageBtnList.Add(nextitem);
}
private void AddLastButton(IList<PageButton> pageBtnList)
{
var lastitem = new PageButton(PagerSetting.LastPageText, PagerSetting.PageCount, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.LastPageButton);
pageBtnList.Add(lastitem);
}
private IList<PageButton> AddButtons()
{
IList<PageButton> pageBtnList = new List<PageButton>();
AddFristButton(pageBtnList); //<---添加第一页
AddPrevButton(pageBtnList); //<---添加前一页
AddMoreButtonBefore(pageBtnList); //<---添加更多按钮(前置)
AddNumberButton(pageBtnList); //<---添加数字分页按钮
AddMoreButtonAfter(pageBtnList); //<---添加更多按钮(后置)
AddNextButton(pageBtnList); //<---添加下一页
AddLastButton(pageBtnList); //<---添加最后一页
IEnumerable<PageButton> currentPages = pageBtnList.Where(p => p.PageIndex == PagerSetting.CurrentPageIndex);
foreach (PageButton btn in currentPages)
btn.Disabled = true;
return pageBtnList;
}
#endregion
/// <summary>
/// 一个按钮或者少于一个按钮的时候
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnLessThanOnePage()
{
return new List<PageButton>() {
new PageButton(PagerSetting.FirstPageText,1,true,PageButtonType.FirstPageButton)
};
}
/// <summary>
/// 第一页时
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenFrist()
{
IList<PageButton> defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.PrevPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.FirstPageButton).Hide = true;
return defaultPageButtons;
}
/// <summary>
/// 最后一页时
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenLast()
{
IList<PageButton> defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.NextPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.LastPageButton).Hide = true;
return defaultPageButtons;
}
/// <summary>
/// 默认情况
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenDefault()
{
Init();
return AddButtons();
}
}
}
using System.Linq;
using System.Text;
using System;
namespace MvcPagerx{
/// <summary>
/// 普通的分页类
/// </summary>
public class NormalPageProc : IPageAble
{
#region fields
private int _StartPageIndex;
private int _EndPageIndex;
public PagerSettings PagerSetting { get; set; }
#endregion
#region Private Method
private void Init()
{
_StartPageIndex = PagerSetting.CurrentPageIndex - (PagerSetting.NumericPagerCount / 2);
if (_StartPageIndex + PagerSetting.NumericPagerCount > PagerSetting.PageCount)
_StartPageIndex = PagerSetting.PageCount + 1 - PagerSetting.NumericPagerCount;
if (_StartPageIndex < 1)
_StartPageIndex = 1;
_EndPageIndex = _StartPageIndex + PagerSetting.NumericPagerCount - 1;
if (_EndPageIndex > PagerSetting.PageCount)
_EndPageIndex = PagerSetting.PageCount;
}
private void AddFristButton(IList<PageButton> pageBtnList)
{
PageButton fristitem = new PageButton(PagerSetting.FirstPageText, 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.FirstPageButton);
pageBtnList.Add(fristitem);
}
private void AddPrevButton(IList<PageButton> pageBtnList)
{
var previtem = new PageButton(PagerSetting.PrevPageText, PagerSetting.CurrentPageIndex - 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.PrevPageButton);
pageBtnList.Add(previtem);
}
private void AddMoreButtonBefore(IList<PageButton> pageBtnList)
{
if (_StartPageIndex > 1 && PagerSetting.ShowMorePagerItems)
{
var index = _StartPageIndex - 1;
if (index < 1) index = 1;
PageButton item = new PageButton(PagerSetting.MorePageText, index, false, PageButtonType.MorePageButton);
pageBtnList.Add(item);
}
}
private void AddNumberButton(IList<PageButton> pageBtnList)
{
for (var pageIndex = _StartPageIndex; pageIndex <= _EndPageIndex; pageIndex++)
{
var text = pageIndex.ToString();
if (pageIndex == PagerSetting.CurrentPageIndex && !string.IsNullOrEmpty(PagerSetting.CurrentPageNumberFormatString))
text = String.Format(PagerSetting.CurrentPageNumberFormatString, text);
else if (!string.IsNullOrEmpty(PagerSetting.PageNumberFormatString))
text = String.Format(PagerSetting.PageNumberFormatString, text);
var item = new PageButton(text, pageIndex, false, PageButtonType.NumericPageButton);
pageBtnList.Add(item);
}
}
private void AddMoreButtonAfter(IList<PageButton> pageBtnList)
{
if (_EndPageIndex < PagerSetting.PageCount)
{
var index = _StartPageIndex + PagerSetting.NumericPagerCount;
if (index > PagerSetting.PageCount) index = PagerSetting.PageCount;
var item = new PageButton(PagerSetting.MorePageText, index, false, PageButtonType.MorePageButton);
pageBtnList.Add(item);
}
}
private void AddNextButton(IList<PageButton> pageBtnList)
{
var nextitem = new PageButton(PagerSetting.NextPageText, PagerSetting.CurrentPageIndex + 1, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.NextPageButton);
pageBtnList.Add(nextitem);
}
private void AddLastButton(IList<PageButton> pageBtnList)
{
var lastitem = new PageButton(PagerSetting.LastPageText, PagerSetting.PageCount, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.LastPageButton);
pageBtnList.Add(lastitem);
}
private IList<PageButton> AddButtons()
{
IList<PageButton> pageBtnList = new List<PageButton>();
AddFristButton(pageBtnList); //<---添加第一页
AddPrevButton(pageBtnList); //<---添加前一页
AddMoreButtonBefore(pageBtnList); //<---添加更多按钮(前置)
AddNumberButton(pageBtnList); //<---添加数字分页按钮
AddMoreButtonAfter(pageBtnList); //<---添加更多按钮(后置)
AddNextButton(pageBtnList); //<---添加下一页
AddLastButton(pageBtnList); //<---添加最后一页
IEnumerable<PageButton> currentPages = pageBtnList.Where(p => p.PageIndex == PagerSetting.CurrentPageIndex);
foreach (PageButton btn in currentPages)
btn.Disabled = true;
return pageBtnList;
}
#endregion
/// <summary>
/// 一个按钮或者少于一个按钮的时候
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnLessThanOnePage()
{
return new List<PageButton>() {
new PageButton(PagerSetting.FirstPageText,1,true,PageButtonType.FirstPageButton)
};
}
/// <summary>
/// 第一页时
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenFrist()
{
IList<PageButton> defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.PrevPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.FirstPageButton).Hide = true;
return defaultPageButtons;
}
/// <summary>
/// 最后一页时
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenLast()
{
IList<PageButton> defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.NextPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.LastPageButton).Hide = true;
return defaultPageButtons;
}
/// <summary>
/// 默认情况
/// </summary>
/// <returns></returns>
public IList<PageButton> GetBtnWhenDefault()
{
Init();
return AddButtons();
}
}
}
此类就是普通的分页生成器,在此类实现了IpageAble中定义的各种情况下需要生成的PageButton列表,然后返回给IGeneratePagerHtmlAble的实现类
如下的NormalPagerHtmlGeenerate
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
namespace MvcPagerx
{
/// <summary>
/// 普通分页HTML代码生成类
/// </summary>
internal class NormalPagerHtmlGenerate : IGeneratePagerHtmlAble
{
private Func<RequestContext, string, int, string> _GetUrlCallback;
/// <summary>
/// 分页设置
/// </summary>
public PagerSettings PagerSetting { get; set; }
private string WrapPageButton(PageButton btn)
{
string result = string.Empty;
if (btn.Disabled)
return String.Format("<li><a disabled=\"disabled\">{0}</a></li>", btn.Text);
result = String.Format("<li><a href='{0}'>{1}</a></li>", _GetUrlCallback(PagerSetting.HtmlRequestContext, PagerSetting.PageParameterName, btn.PageIndex), btn.Text);
return result;
}
/// <summary>
/// 生成HTML代码
/// </summary>
/// <param name="pageButtons">按钮列表</param>
/// <returns></returns>
public MvcHtmlString Generate(IList<PageButton> pageButtons)
{
TagBuilder tagBuilder = new TagBuilder(PagerSetting.TagName);
tagBuilder.GenerateId(PagerSetting.TagID);
if (!string.IsNullOrEmpty(PagerSetting.ClassName))
tagBuilder.AddCssClass(PagerSetting.ClassName);
StringBuilder sb = new StringBuilder();
foreach (PageButton btn in pageButtons)
{
if (!btn.Hide)
sb.Append(WrapPageButton(btn));
}
tagBuilder.InnerHtml = sb.ToString();
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
public Func<RequestContext, string, int, string> UrlCallback
{
set
{
_GetUrlCallback = value;
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
namespace MvcPagerx
{
/// <summary>
/// 普通分页HTML代码生成类
/// </summary>
internal class NormalPagerHtmlGenerate : IGeneratePagerHtmlAble
{
private Func<RequestContext, string, int, string> _GetUrlCallback;
/// <summary>
/// 分页设置
/// </summary>
public PagerSettings PagerSetting { get; set; }
private string WrapPageButton(PageButton btn)
{
string result = string.Empty;
if (btn.Disabled)
return String.Format("<li><a disabled=\"disabled\">{0}</a></li>", btn.Text);
result = String.Format("<li><a href='{0}'>{1}</a></li>", _GetUrlCallback(PagerSetting.HtmlRequestContext, PagerSetting.PageParameterName, btn.PageIndex), btn.Text);
return result;
}
/// <summary>
/// 生成HTML代码
/// </summary>
/// <param name="pageButtons">按钮列表</param>
/// <returns></returns>
public MvcHtmlString Generate(IList<PageButton> pageButtons)
{
TagBuilder tagBuilder = new TagBuilder(PagerSetting.TagName);
tagBuilder.GenerateId(PagerSetting.TagID);
if (!string.IsNullOrEmpty(PagerSetting.ClassName))
tagBuilder.AddCssClass(PagerSetting.ClassName);
StringBuilder sb = new StringBuilder();
foreach (PageButton btn in pageButtons)
{
if (!btn.Hide)
sb.Append(WrapPageButton(btn));
}
tagBuilder.InnerHtml = sb.ToString();
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
}
public Func<RequestContext, string, int, string> UrlCallback
{
set
{
_GetUrlCallback = value;
}
}
}
}
交给此类后便能生成HTML代码到前端展示了,还是相当的简单吧,更多的东西直接看代码吧,这里只是提一下大概思路。