用于BlogEngine.net的分页控件

by Jason 2008-08-25,21:56

BlogEngine.net仅提供了简单的分页功能,看着很不舒服,于是自己动手写了一个分页控件。分页控件Pager通过在URL中添加"page"参数以超链接形式实现页面导航,没有使用任何ViewState和Session变量,完全与BlogEngine.net兼容,同时尽量做到通用,应该可以满足绝大部分ASP.NET程序的分页需要。下图是Pager的显示效果:

分页控件页面导航按钮的实现就不详细说了,具体请看源代码及注释。下面说说分页控件是怎么实现页面导航URL的。考虑到通用性,在页面URL中添加“page”参数应当考虑以下几种情况:
1、URL中已包含page参数,如:
http://www.tiray.net/default.aspx?page=2
http://www.tiray.net/default.aspx?param1=value1&page=2
对于这种情况,可以使用正则表达式"page=([1-9])"对URL进行替换
2、URL中未包含page参数,这又分为两种情况:
 (1)URL中包含其它参数,如:
 http://www.tiray.net/default.aspx?param1=value1
 这种情况只需在URL末尾添加"&page=xx"即可
 (2)URL中未包含其它参数,如:
 http://www.tiray.net/default.aspx
 这种情况只需要在URL末尾添加"?page=xx"即可
 下面是产生页面导航URL的函数:

/// <summary>
/// Get Page Url by page index
/// </summary>
/// <param name="pageIndex">Page Index</param>
/// <returns>Page Url</returns>
protected string GetPageUrl(long pageIndex)
{
    string url = HttpContext.Current.Request.RawUrl;
    Regex reg= new Regex("page=([1-9])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
    if(reg.Match(url).Success)
        url=reg.Replace(url,"page="+pageIndex.ToString());
    else
    {
        if(url.Contains("?"))
            url += "&page=" + pageIndex.ToString();
        else 
            url += "?page=" + pageIndex.ToString();
    }
    if (url.Contains("?page=1&"))
        url = url.Replace("page=1&", string.Empty);
    else if(url.Contains("?page=1"))
        url = url.Replace("?page=1", string.Empty);
    else if(url.Contains("&page=1"))
        url=url.Replace("&page=1",string.Empty);
    return url;
}

Pager控件属性说明
PageSize

  每页所包含的记录数,可读写
TotalRecords
  总记录数,可读写
MaxPages
  控件显示的最大分页按钮数,可读写,默认值为5
PageIndex
  当前页面索引值,只读,这是从当前页面URL的"page"参数中获得的
TotalPages
  总页数,只读。根据PageSize和TotalRecords计算得出。
FormatString
  用于显示总页面数及总记录数的字符串格式。默认值为:"{0}Pages,{1}Records"
只需要设置PageSize、MaxPages和TotalRecords三个参数,就可以很方便地使用Pager控件来。

在Blogengine.net中使用Pager控件:
1、修改PostList.ascx如下所示,注意我使用了两个Pager控件:HeadPager和FootPager,具体效果请看http://www.tiray.net

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="PostList.ascx.cs" EnableViewState="false" Inherits="User_controls_PostList" %>
<div align="right" id="headPaging">
    <blog:Pager ID="headPager" runat="server"></blog:Pager>&nbsp;</div>
<div runat="server" id="posts" class="posts" />
<div align="right" id="footPaging">
    <blog:Pager ID="footPager" runat="server"></blog:Pager>&nbsp;</div>

2、修改PostList.ascx.cs中的部分代码,主要是用Bind函数替换了原来的BindPosts函数和InitPaging函数。

private void Bind()
{
    List<IPublishable> visiblePosts = Posts.FindAll(delegate(IPublishable p) { return p.IsVisible; });
    int count = Math.Min(BlogSettings.Instance.PostsPerPage, visiblePosts.Count);
   
    //Init Pager
    headPager.TotalRecords = footPager.TotalRecords = visiblePosts.Count;
    headPager.PageSize = footPager.PageSize = BlogSettings.Instance.PostsPerPage;
    headPager.FormatString = footPager.FormatString = Resources.labels.pagerFormatString;
    headPager.FirstPageString = footPager.FirstPageString = Resources.labels.firstPage;
    headPager.LastPageString = footPager.LastPageString = Resources.labels.lastPage;
    headPager.NextPageString = footPager.NextPageString = Resources.labels.nextPage;
    headPager.PrevPageString = footPager.PrevPageString = Resources.labels.prevPage;
 
    int page = (int)footPager.PageIndex;
    int index = page * count;
    int stop = count;
    if (index + count > footPager.TotalRecords)
        stop = (int)footPager.TotalRecords - index;
 
    string query = Request.QueryString["theme"];
    string theme = !string.IsNullOrEmpty(query) ? query : BlogSettings.Instance.Theme;
    string path = Utils.RelativeWebRoot + "themes/" + theme + "/PostView.ascx";
    int counter = 0;
 
    foreach (Post post in visiblePosts.GetRange(index, stop))
    {
        if (counter == stop)
            break;
 
        PostViewBase postView = (PostViewBase)LoadControl(path);
        postView.ShowExcerpt = BlogSettings.Instance.ShowDescriptionInPostList;
        postView.Post = post;
        postView.ID = post.Id.ToString().Replace("-", string.Empty);
        postView.Location = ServingLocation.PostList;
        posts.Controls.Add(postView);
        counter++;
    }
}

3、Pager使用了以下全球化资源:
pagerFormatString,默认值为"{0}Pages,{1}Records"
firstPage,默认值为"First Page"
lastPage,默认值为"Last Page"
nextPage,默认值为"Next Page"
prevPage,默认值为"Previous Page"

附:
分页控件Pager的源代码,下载后复制到/App_Code/Controls目录
Pager.rar (2.68 kb)

PostList控件源代码,下载后覆盖/User Controls目录下的同名文件
PostList.rar (2.00 kb)



当前评分 5.0 , 共有 2 人参与

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
标签:, , ,
分类:.NET编程 | 博客技术

评论

添加评论




biuquote
  • 评论
  • 在线预览
Loading

Powered by BlogEngine.NET 1.4.5.10 Theme by Mads Kristensen
滇ICP备06001863号

我的软件

最新评论

Comment RSS

声明

  如非特别注明,本网站发布的所有文章、源代码及软件均为原创,其版权归www.tiray.net所有。如需转载或引用,请注明出处并通知作者。
  本网站建立于中华人民共和国境内,受中华人民共和国法律法规约束。请勿在本网站发表违反国家法律法规的言论。