博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【分享】一个Asp.net mvc下的分页控件MvcPagerX
阅读量:4978 次
发布时间:2019-06-12

本文共 8425 字,大约阅读时间需要 28 分钟。

 分页再平常不过的需求,其实也很简单完全可以写百行以内的代码扩展到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 { 
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;
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;
            }
        }
    }

} 

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

 

 

 

转载于:https://www.cnblogs.com/xianhong/archive/2011/04/21/2024296.html

你可能感兴趣的文章
Oracle命令类别
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
css选择器
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Spring中使用Velocity模板
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>
gvim 配置Pydiction
查看>>
Linux安装指定mysql版本
查看>>
分布式锁的三种实现方式
查看>>
poj 2109 pow函数也能这么用?p的开n次方
查看>>
Oracle database link
查看>>
python调用shell小技巧
查看>>
TL431的几种常用用法
查看>>
js 经典闭包题目详解
查看>>
在项目中移除CocoaPods
查看>>
【洛谷】CYJian的水题大赛【第二弹】解题报告
查看>>