zoukankan      html  css  js  c++  java
  • 【分享】一个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 

  • 相关阅读:
    MyEclipse持续性开发教程:用JPA和Spring管理数据(三)
    DevExpress v17.2新版亮点—DevExtreme篇(三)
    MyEclipse持续性开发教程:用JPA和Spring管理数据(二)
    DevExpress v17.2新版亮点—DevExtreme篇(二)
    多线程(1)
    什么是SpringCloud?
    WebStrom常用快捷键
    七、CommonJS规范和Note.js模块概念的介绍
    六、Note开发工具Visual Studio Code下载安装以及Visual Studio Code的使用
    JSP标签
  • 原文地址:https://www.cnblogs.com/xianhong/p/2024296.html
Copyright © 2011-2022 走看看