ASP.NET MVC之PagedList使用


ASP.NET MVC之PagedList使用

  ---由於最近項目中用到了分頁這里也來記錄一下,一方面給自己一個記錄,另一方面給后來者一些幫助!

一、首先大家先來看一下效果

  

  

二、然后說一下穿插的技術

  • MVC5
  • PagedList
  • EF6
  • @helper
  • Regex
  • Autofac
  • 偽靜態

  暫時想到這些

 三、細說下PagedList及其比較其他分頁

   PagedList是NuGet上提供的一個分頁的類庫,能對任何 IEnumerable<T>進行分頁,而且非常簡單好用。從NuGet上,可以獲取兩個DLL:PagedList.dll和 PagedList.Mvc.dll。PagedList.dll提供分頁的核心操作,PagedList.Mvc.dll是一個輔助類庫,在創建分頁的 UI時候提供簡單、可擴展的創建方法。不過PagedList.dll可以用於MVC2及其以上,但是PagedList .Mvc.dll只能用於MVC3(及其以上)。

  2014年開始,作者改名為X.PagedList.Mvc,聽說用這個插件的話會非常便利,大家可以試試(自己沒用過只是聽說)。

  我的項目中主要是PagedList.Mvc.4.5.0.0 和PagedList.1.17.0.0

   

 

   

   在選擇分頁插件的時候,nuget上的下載量直接決定了我的使用。pagedlist暫時還沒有實現異步,這方面mvcpager 倒是可以,但是寫起來比較麻煩,還有繁瑣的js,這

是不是我想要的。

 四、使用PagedList

   大家可以直接使用nuget安裝PagedList.Mvc,期間會連同PageList一起裝上。完成以后會看到項目中多了着兩個引用:

  

  剛開始自己也是使用的ToPagedList() 但這樣會取出所有的數據在分頁,所以后來就用了StaticPagedList(System.Collections.Generic.IEnumerable<T> subset, int pageNumber, int pageSize, int totalItemCount),接下來就直說后者了。

  可以看到,StaticPagedList需要將:某一頁的數據、頁碼、每頁數據的容量、和數據總條目傳入。也就是說這時候StaticPagedList不再像PagedList一樣承擔數據的划分工作,而僅僅承擔數據的綁定操作,上面也說到了我的項目中用了aotufac,所以對兩個方法進行了封裝,直接上代碼

  

public virtual List<T> GetPageList<TKey, TTKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> order, Expression<Func<T, TTKey>> thenorder, int pageIndex, int pageSize, ref int totalCount, bool IsDesc1 = true,bool IsDesc2=true)
        {
            IQueryable<T> data = null;
            if (IsDesc1)
            {
                if (IsDesc2)
                {
                    data = dbset.Where(where).OrderByDescending(order).ThenByDescending(thenorder).Skip((pageIndex - 1) * pageSize).Take(pageSize).AsNoTracking();
                }
                else
                {
                    data = dbset.Where(where).OrderByDescending(order).OrderBy(thenorder).Skip((pageIndex - 1) * pageSize).Take(pageSize).AsNoTracking();
                }
                
            }
            else
            {
                if (IsDesc2)
                {
                    data = dbset.Where(where).OrderBy(order).ThenByDescending(thenorder).Skip((pageIndex - 1) * pageSize).Take(pageSize).AsNoTracking();
                }
                else
                {
                    data = dbset.Where(where).OrderBy(order).ThenBy(thenorder).Skip((pageIndex - 1) * pageSize).Take(pageSize).AsNoTracking();
                }
            }
            totalCount = dbset.Where(where).Count();
            return data.ToList();
        }
View Code

 

public virtual StaticPagedList<T> GetStaticPageList(List<T> data, int pageIndex, int pageSize, int totalCount)
        {
            return new StaticPagedList<T>(data, pageIndex, pageSize, totalCount);
        }
View Code

  下面是上面兩個方法的使用,其中articleRepository你就可以認為是一個實體類。

public ActionResult Index(int page = 1)
        {
            int pageIndex = page;
            int pageSize = PageCount;
            int totalCount = 0;
            var article = articleRepository.GetPageList(m => true, m => m.IsTop,m=>m.PublishDate, pageIndex, pageSize, ref totalCount);

            var staticPageList = articleRepository.GetStaticPageList(article, pageIndex, pageSize, totalCount);
            return View("article", staticPageList);
        }

  再來看一些View,其中mode的類型以及PagedListPager的參數類型 於 ToPagedList()的時候是不一樣的

  

  

  如果做到以上基本上就可以實現分頁了,但是還由於使用了偽靜態,而PagedList分頁時是這樣 ?page=2  傳遞參數的,就是讓url很不友好,所搜了半天看往上說

PagedList可以直接使用 /id 來傳遞參數,但是自己沒能實現了,coder友如果可以實現,請告知。而最終我選擇l利用 @helper 修改的方式來實現


   下面是我的PageHelpers.cshtml的代碼,當然也通過重寫HtmlHelper的方式來實現,不過感覺這樣更好一些,寫起來更方便一些,尤其是怕對於拼寫html標簽,當然

我這個沒有用到html標簽,方法用到了正則來替換掉我不需要的東西,最終拼接成這樣 /article/3.html

@helper PageList(string html,string controller, string action, string page)
{
    string newHtml = Regex.Replace(html, @"(?<=""\/).*?(?:=)", controller + "/" + action + "/");
    Regex reg = new Regex(@"(?<=\/)\d+");
    newHtml = reg.Replace(newHtml, "$&.html");

    //string newHtml = Regex.Replace(html, @"(?<="")\/.*?(?:=\d+)", "javascript:void(0);");
    @Html.Raw(newHtml);
}

  下面就是是處理PagedListPager渲染后的html,直接調用上面的方法

@PageHelpers.PageList(Html.PagedListPager((IPagedList)Model, page => Url.Action(ViewContext.RouteData.Values["action"].ToString().Replace(".html", ""), new { page })).ToString(), ViewContext.RouteData.Values["controller"].ToString(), ViewContext.RouteData.Values["action"].ToString(), "1");

 

五、總結

  這次pagedlist使用從剛開始的所搜到最后的使用,也學到了很多,

  提供一下參考的文章

  http://www.tuicool.com/articles/Bnm6fy

  http://www.cnblogs.com/tangmingjun/archive/2012/05/30/2526301.html

  http://www.bcnds.com/article/2015/6/1032.html

 

  理解錯誤的,還請coder友多多指正!

  文章含義模糊的,還請Coder友多多包含!

  切磋問題的,還請coder友多多聯系!

  PS:NET/前端技術交流群 190293245

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM