[转载]一个Asp.net mvc下的分页控件MvcPagerX

[转载]【分享】一个Asp.net mvc下的分页控件MvcPagerX - 哥在博客园 - 博客园.

分页再平常不过的需求,其实也很简单完全可以写百行以内的代码扩展到HtmlHelper上实现,但是为了扩展性,我稍微(这所以是稍微,是因为本 人只稍微了解,还不敢说用得很熟练)用了点面向对象的思想对这个分页控件进行了设计,当然设计之前也参考了一些盆友的作品。吸取了一些思想的精华,下面就 讲讲怎么设计以及为什么要这么设计

接口部分:
[csharp]
using System.Collections.Generic;

namespace MvcPagerx
{
///

/// 分页接口
///

public interface IPageAble
{
///

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

///
IList GetBtnLessThanOnePage();
///

/// 第一页时
///

///
IList GetBtnWhenFrist();
///

/// 最后一页时
///

///
IList GetBtnWhenLast();
///

/// 默认情况
///

///
IList GetBtnWhenDefault();
///

/// 分页设置
///

PagerSettings PagerSetting { get; set; }
}
}
[/csharp]
此接口主要标明实现类可以被分页,在需要分页的各种情况给出反馈,有

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

第一页时

最后一页时

默认情况
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;

namespace MvcPagerx
{
///

/// 能够根据分页按钮生成HTML接口
///

public interface IGeneratePagerHtmlAble
{
///

/// PagerSetting
///

PagerSettings PagerSetting { get; set; }
///

/// Generate
///

/// ///
MvcHtmlString Generate(IList pageButtons);

Func UrlCallback { set; }
}
}
[/csharp]
【分享】一个Asp.net mvc下的分页控件MvcPagerX
2011-04-21 22:39 by 鲜宏, 1222 visits, 网摘, 收藏, 编辑

分页再平常不过的需求,其实也很简单完全可以写百行以内的代码扩展到HtmlHelper上实现,但是为了扩展性,我稍微(这所以是稍微,是因为本人只稍微了解,还不敢说用得很熟练)用了点面向对象的思想对这个分页控件进行了设计,当然设计之前也参考了一些盆友的作品。吸取了一些思想的精华,下面就讲讲怎么设计以及为什么要这么设计

接口部分:

using System.Collections.Generic;

namespace MvcPagerx
{
///

/// 分页接口
///

public interface IPageAble
{
///

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

///
IList GetBtnLessThanOnePage();
///

/// 第一页时
///

///
IList GetBtnWhenFrist();
///

/// 最后一页时
///

///
IList GetBtnWhenLast();
///

/// 默认情况
///

///
IList GetBtnWhenDefault();
///

/// 分页设置
///

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
{
///

/// 能够根据分页按钮生成HTML接口
///

public interface IGeneratePagerHtmlAble
{
///

/// PagerSetting
///

PagerSettings PagerSetting { get; set; }
///

/// Generate
///

/// ///
MvcHtmlString Generate(IList pageButtons);

Func UrlCallback { set; }
}
}

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

实现类部分:
[csharp]
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
namespace MvcPagerx
{
///

/// 普通的分页类
///

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 pageBtnList)
{
PageButton fristitem = new PageButton(PagerSetting.FirstPageText, 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.FirstPageButton);
pageBtnList.Add(fristitem);
}

private void AddPrevButton(IList pageBtnList)
{
var previtem = new PageButton(PagerSetting.PrevPageText, PagerSetting.CurrentPageIndex - 1, PagerSetting.CurrentPageIndex == 1, PageButtonType.PrevPageButton);
pageBtnList.Add(previtem);
}

private void AddMoreButtonBefore(IList 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 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 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 pageBtnList)
{
var nextitem = new PageButton(PagerSetting.NextPageText, PagerSetting.CurrentPageIndex + 1, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.NextPageButton);
pageBtnList.Add(nextitem);
}

private void AddLastButton(IList pageBtnList)
{
var lastitem = new PageButton(PagerSetting.LastPageText, PagerSetting.PageCount, PagerSetting.CurrentPageIndex >= PagerSetting.PageCount, PageButtonType.LastPageButton);
pageBtnList.Add(lastitem);
}

private IList AddButtons()
{
IList pageBtnList = new List();
AddFristButton(pageBtnList); //<---添加第一页 AddPrevButton(pageBtnList); //<---添加前一页 AddMoreButtonBefore(pageBtnList); //<---添加更多按钮(前置) AddNumberButton(pageBtnList); //<---添加数字分页按钮 AddMoreButtonAfter(pageBtnList); //<---添加更多按钮(后置) AddNextButton(pageBtnList); //<---添加下一页 AddLastButton(pageBtnList); //<---添加最后一页 IEnumerable currentPages = pageBtnList.Where(p => p.PageIndex == PagerSetting.CurrentPageIndex);
foreach (PageButton btn in currentPages)
btn.Disabled = true;
return pageBtnList;
}
#endregion

///

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

///
public IList GetBtnLessThanOnePage()
{
return new List() {
new PageButton(PagerSetting.FirstPageText,1,true,PageButtonType.FirstPageButton)
};
}

///

/// 第一页时
///

///
public IList GetBtnWhenFrist()
{
IList defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.PrevPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.FirstPageButton).Hide = true;
return defaultPageButtons;
}

///

/// 最后一页时
///

///
public IList GetBtnWhenLast()
{
IList defaultPageButtons = GetBtnWhenDefault();
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.NextPageButton).Hide = true;
defaultPageButtons.SingleOrDefault(m => m.ButtonType == PageButtonType.LastPageButton).Hide = true;
return defaultPageButtons;
}

///

/// 默认情况
///

///
public IList GetBtnWhenDefault()
{
Init();
return AddButtons();
}

}
}
[/csharp]
此类就是普通的分页生成器,在此类实现了IpageAble中定义的各种情况下需要生成的PageButton列表,然后返回给IGeneratePagerHtmlAble的实现类

如下的NormalPagerHtmlGeenerate
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;

namespace MvcPagerx
{
///

/// 普通分页HTML代码生成类
///

internal class NormalPagerHtmlGenerate : IGeneratePagerHtmlAble
{

private Func _GetUrlCallback;

///

/// 分页设置
///

public PagerSettings PagerSetting { get; set; }

private string WrapPageButton(PageButton btn)
{
string result = string.Empty;
if (btn.Disabled)
return String.Format("

  • {0}
  • ", btn.Text);
    result = String.Format("

  • {1}
  • ", _GetUrlCallback(PagerSetting.HtmlRequestContext, PagerSetting.PageParameterName, btn.PageIndex), btn.Text);
    return result;
    }

    ///

    /// 生成HTML代码
    ///

    /// 按钮列表 ///
    public MvcHtmlString Generate(IList 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 UrlCallback
    {
    set
    {
    _GetUrlCallback = value;
    }
    }
    }
    }
    [/csharp]
    交给此类后便能生成HTML代码到前端展示了,还是相当的简单吧,更多的东西直接看代码吧,这里只是提一下大概思路。

    MvcPagerx.rar