【分享】一个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 { getset; }
    }
}

 

此接口主要标明实现类可以被分页,在需要分页的各种情况给出反馈,有 

一个按钮或者少于一个按钮的时候

第一页时 

  最后一页时

默认情况 

 

 

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 { getset; }
        
/// <summary>
        
/// Generate
        
/// </summary>
        
/// <param name="pageButtons"></param>
        
/// <returns></returns>
        MvcHtmlString Generate(IList<PageButton> pageButtons);

        Func
<RequestContext, stringintstring> UrlCallback { set; }
    }
}

 

这个接口呢用于标明实现类具有生成HTML代码的功能,在这里我们可以看到,传入的参数是IList<PageButton>,返回的是MvcHtmlString,为什么要传入IList<PageButton>,因为这里给这个接口定位很明确就是只是完成将PageButton这种实体列表转换为相应的HTML代码就可以了。那么谁负责生成IList<PageButton>呢,看看上面的IpageAble接口便知道,那就是实现了IpageAble的类,请看下面

 

实现类部分:


using System.Collections.Generic;
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 { getset; }
        
#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, stringintstring> _GetUrlCallback;

        
/// <summary>
        
/// 分页设置
        
/// </summary>
        public PagerSettings PagerSetting { getset; }


        
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, stringintstring> UrlCallback
        {
            
set
            {
                _GetUrlCallback 
= value;
            }
        }
    }

} 

 交给此类后便能生成HTML代码到前端展示了,还是相当的简单吧,更多的东西直接看代码吧,这里只是提一下大概思路。

MvcPagerx.rar 

 

 

posted @ 2011-04-21 22:39  鲜宏  阅读(2348)  评论(5编辑  收藏  举报