Fork me on GitHub

MvcPager 分页示例 — 文章内容分页

该示例演示如何用MvcPager实现长文章内容分页。

文章内容分页的实现原理是:在文章录入或编辑时在需要分页的地方插入分页符(一般富文本编辑器都有此功能),获取文章内容后通过正则表达式获取文章中所有分页符,每个分页符之间的内容即为一页,所有分页符总数即为总页数。

吴起婚嫁习俗

来源:吴起热线   作者:Webdiyer    发布日期:2011/3/5 0:00:00

吃茶馃

这是正日的第一顿饭,即用一些油炸食物、点心伴饮茶水。

吃油饴恪

这是正日的第二顿饭。即吃吴起特产的荞面饴铬,汤里除了臊子外全是清油,并炼熟一盆子黄芥油放在饭桌上,再配有许多小菜,由客人根据自己的口味食量随便调食。油饴铬拌小菜非常好吃,很多赶事情的就是奔这一顿饭来的,油饴铬吃好了,就觉得这个事情过得好,赶得值。

拜祖

这是旧时正日一项重大活动,院子中央支一张桌子摆上饭食、酒菜,有影的人家把影(先祖像布)挂起,无影的放几个祖先的牌位,或写一“供奉某门宗祖三代之灵位”的牌子放在桌上。新郎家的男人和婆姨按辈分,一辈一辈排队,行三叩九拜礼,现在已被取消。

记礼

认大小之前要记礼,订一个专门的礼簿,支一张桌子,摆上烟、酒,由一名有文化的人记礼,一人收礼(记礼和收礼人多为女婿客),先从外家开始,逐一记收来宾所带的礼。过红事行礼,过去都有一些不成文的规矩和专门的用语。男外家客行的礼叫“花红”即是被面,没有被面的年代也要扯丈二花布给新郎披在肩上,新郎挂披得越多,越显示外家的富有;女外家行的礼叫“铺盖”,过去是毛毡、被子,现在改为毛毯,有全铺和半铺之分,行全铺礼的到了新郎家要给女外家人退还一半(折合成现金)。男女外家行的礼,是最多的,因此也最受尊重,事情上所有事唯外家人的马头是瞻,其他人都不能超过。但那是老讲究,现在同学、朋友行的礼都超过了外家人。女婿、外甥娶媳妇要行袜子礼,出嫁女儿要行中衣礼;亲戚朋友行朋亲礼,这没有具体规定;出嫁女儿家门只填箱。娶媳妇家门只放拜礼,不记礼。

View:

@model PagedArticle
<h2 class="center">@Model.Title</h2>
<div class="center">来源:@Model.Source   作者:@Model.Author    发布日期:@Model.PubDate</div>
<div class="content">@Html.Raw(Model.Content)</div>
<div class="text-center">
    @Html.Pager(Model).Options(o => o.SetContainerTagName("ul").SetCssClass("pagination").SetCurrentPagerItemTemplate("<li class=\"active\"><a href=\"#\">{0}</a></li>").SetDisabledPagerItemTemplate("<li class=\"disabled\"><a>{0}</a></li>").SetPagerItemTemplate("<li>{0}</li>").SetPageIndexParameterName("id").SetRouteName("MvcPager_Default"))
</div>
    

Model:

    [NotMapped]
    public class PagedArticle:Article,IPagedList<string>
    {
        private readonly IEnumerable<string> _pagedContent;
        private PagedArticle(){}
        public PagedArticle(Article art, int pageIndex)
        {
            //获取文章内容中的分页符的正则表达式,分页符通过ckeditor等富文本编辑器的“插入分页符”功能插入到文章中,html代码为“<div style="page-break-after: always"> <span style="display: none;">&nbsp;</span></div>”
            var re = new Regex("<div\\s+style =\"page-break-after:\\s*always;?\">[\\r\\n]*.*?</div>",
                               RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled |
                               RegexOptions.IgnorePatternWhitespace);
            _pagedContent = re.Split(art.Content);
            if(pageIndex>_pagedContent.Count()||pageIndex<1) throw new invalidoperationexception("页索引超出界限");
                                                             id=art.ID;
                                                             title=art.Title;
                                                             author=art.Author;
                                                             content=_pagedContent.ToArray()[pageIndex - 1];
                                                             pubdate=art.PubDate;
                                                             source=art.Source;
                                                             currentpageindex=pageIndex;
                                                             pagesize=1;
                                                             totalitemcount=_pagedContent.Count();
                                                             }
                                                             public ienumerator<string> GetEnumerator()
        {
            return _pagedContent.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public int CurrentPageIndex { get; set; }
        public int PageSize { get { return 1; } set{} }
        public int TotalItemCount { get; set; }
    }

Controller:

        
        public ActionResult ContentPaging(int id=1)
        {
            using (var db = new DataContext())
            {
                var art = db.Articles.SingleOrDefault(a => a.ID == 25); //获取演示用的长文章
                if (art != null)
                {
                    return View(new PagedArticle(art, id));
                }
                return new HttpNotFoundResult("找不到指定的文章");
            }
        }