淺談MVC3自訂分頁

來源:互聯網
上載者:User

分頁這個東西剛開始自己來寫的時候感覺很複雜,在網路上分頁大部分都是比較成熟分頁空間,對於新手的我查看其代碼有時真的看的不太明白,最近自己在用到MVC3做分頁查看資料,有些總結

1、分頁基本參數:pageSize、pageIndex、Total

其中Total,這個也就是要查詢資料的總個數,到時用來產生分頁控制項

2、Controll 部分

public ActionResult Paging(int? pageIndex, int pageSize = 5)
        {
            int total = 0;
            pageIndex = pageIndex == null ? 0 : pageIndex;

            //擷取資料
            MercuryDbExEntities db = new MercuryDbExEntities();
            total = db.Users.Count();
            var result = db.Users.OrderBy(p => p.Id).Skip(pageIndex.Value * pageSize).Take(pageSize);

            ViewBag.Pagination = new Pagination(pageIndex, pageSize, total);
            return View(result);
        }

3、

public class Pagination
    {
        public int? PageIndex { get; private set; }//當前頁號減一的值
        public int PageSize { get; private set; } //每頁顯示的內容數量
        public int TotalPages { get; private set; }//總頁數
        public int Start { get; private set; }//當前頁面,顯示的第一個頁號(比如在中間的頁面,頁號顯示是9號到16號,9就是Start)
        public int End { get; private set; }//當前頁面,顯示的最後一個頁號

        public Pagination(int? pageIndex, int pageSize, int totalcount)
        {
            PageIndex = (pageIndex ?? 0);
            PageSize = pageSize; ;
            TotalPages = (int)Math.Ceiling(totalcount / (double)PageSize);

            int size;//判定每個頁面顯示多少個頁號
            if (TotalPages > 6)//這裡規定每個頁面顯示6個頁號
            {
                size = 6;
                //定義每個頁面的頁號從幾開始
                if (pageIndex > 2 && pageIndex < TotalPages - (size - 2))
                {
                    Start = (pageIndex ?? 0) - 1;
                }
                else if (pageIndex >= TotalPages - (size - 2))
                {
                    Start = TotalPages - size + 1;
                }
                else
                {
                    Start = 1;
                }
            }
            else
            {
                size = TotalPages;
                Start = 1;

            }

            End = Start + size - 1;
        }

        // 為“上一頁”“下一頁”導航備用
        public bool HasPreviousPage
        {
            get { return (PageIndex > 0); }
        }

        public bool HasNextPage
        {
            get { return (PageIndex + 1 < TotalPages); }
        }
    }

4、View部分

--內容展示部分

@model IEnumerable<Mvc3_Test.DataBase.Users>
@using Mvc3_Test.Htmlhelpers
@{
    ViewBag.Title = "Paging";
}
<h2>內容展示</h2>
@foreach (var item in Model)
{
    <p>
        @item.Id <b>|</b>@item.LoginName
    </p>
}
<hr />
@Html.Partial("_Pagination", (Mvc3_Test.Htmlhelpers.Pagination)ViewBag.Pagination)

--分頁標籤展示部分

@model Mvc3_Test.Htmlhelpers.Pagination
@using Mvc3_Test.Htmlhelpers
<div class="clearfix pagination">
    <div class="pagination-inner">
        @if (Model.Start > 1)
        {
            //如果當前頁面超過第二頁則顯示第一頁“1...”的連結
            string url = Html.UrlSet(Request, "pageIndex", 0); 
            <a title="第一頁1..." href="@url">1...</a>                  
        }
        @for (int i = Model.Start; i <= Model.End; i++)
        {
            string url = Html.UrlSet(Request, "pageIndex", i - 1);
            if (i == Model.PageIndex + 1)
            {
                //在當前頁面的幾個頁號中尋找當前頁號               
                <a title="當前第 @i.ToString() 頁"  class="current" href="@url">@i.ToString()</a>           
            }
            else
            {
                <a title="前往第 @i.ToString() 頁@i.ToString()"  href="@url">@i.ToString()</a>           
            }
        }
        @if (Model.End < Model.TotalPages && Model.PageIndex - Model.Start < 2)
        {
            //最後一頁
            string totalPages = (@Model.TotalPages).ToString();
            string url = Html.UrlSet(Request, "pageIndex", Model.TotalPages - 1);            
            <a title="最後一頁@totalPages"  href="@url">@totalPages</a>
        }
    </div>
</div>

【說明:其中大家看到,在對於A標籤的href中代碼進行了@url處理,因為有時項目中用來展示資料的地方會有很多,所以為了使得“分頁標籤展示頁面”得以重用性,又增加了一個類:HtmlHelpers】

5、HtmlHelpers類

public static class HtmlHelpers
    {
        public static string UrlSet(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
        {
            if (queryName != null && queryValue != null)
            {
                string path = request.Path;
                NameValueCollection query = new NameValueCollection(request.QueryString);
                query.Set(queryName, queryValue.ToString());
                return CreateUrl(path, query);
            }
            return request.RawUrl;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="request"></param>
        /// <param name="queryName"></param>
        /// <param name="queryValue"></param>
        /// <returns></returns>
        public static string UrlAdd(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
        {
            if (queryName != null && queryValue != null)
            {
                string path = request.Path;
                NameValueCollection query = new NameValueCollection(request.QueryString);
                query.Add(queryName, queryValue.ToString());
                return CreateUrl(path, query);
            }
            return request.RawUrl;
        }

        public static string UrlRemove(this HtmlHelper helper, HttpRequestBase request, string queryName)
        {
            if (queryName != null)
            {
                string path = request.Path;
                NameValueCollection query = new NameValueCollection(request.QueryString);
                query.Remove(queryName);
                return CreateUrl(path, query);
            }
            return request.RawUrl;
        }

        public static string UrlRemove(this HtmlHelper helper, HttpRequestBase request, string queryName, object queryValue)
        {
            if (queryName != null && queryValue != null)
            {
                string path = request.Path;
                NameValueCollection query = new NameValueCollection(request.QueryString);

                string[] values = query.GetValues(queryName);
                List<string> vs = values.ToList();
                vs.Remove(queryValue.ToString());
                query.Remove(queryName);
                foreach (var item in vs)
                {
                    query.Add(queryName, item);
                }

                return CreateUrl(path, query);
            }
            return request.RawUrl;
        }

        private static string CreateUrl(string path, NameValueCollection query)
        {
            string url = path;
            if (query != null && query.Count != 0)
            {
                url += "?";
                for (int i = 0; i < query.Count; i++)
                {
                    string key = query.GetKey(i);
                    string[] values = query.GetValues(key);
                    for (int j = 0; j < values.Length; j++)
                    {
                        url += key + "=" + values[j] + "&";
                    }
                }

                url = url.TrimEnd('&');
            }
            return url;
        }
    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.