西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)ASP.NET → ASP.NET MVC 數(shù)據(jù)分頁思想及解決方案代碼

ASP.NET MVC 數(shù)據(jù)分頁思想及解決方案代碼

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2012/5/28 16:43:33字體大。A-A+

作者:佚名點擊:763次評論:0次標(biāo)簽: ASP.NET

  • 類型:源碼相關(guān)大。23KB語言:中文 評分:5.0
  • 標(biāo)簽:
立即下載

 作為一個程序猿,數(shù)據(jù)分頁是每個人都會遇到的問題。解決方案更是琳瑯滿目,花樣百出。但基本的思想都是差不多的。

  下面給大家分享一個簡單的分頁器,讓初學(xué)者了解一下最簡單的分頁思想,以及在ASP.NET MVC中的簡單實現(xiàn)與應(yīng)用。

一,定義分頁器類

  在ASP.NET MVC中,分頁的數(shù)據(jù)源可能是各種不同的類型,所以最好使用泛型來定義。

public class PagingHelper<T>

二,基本三要素

  實現(xiàn)分頁人所共知的三個基本屬性:

DataSource:數(shù)據(jù)源,要知道數(shù)據(jù)源共計多少條數(shù)據(jù),會對應(yīng)一個數(shù)據(jù)源的方法-Count(),

PageSize:來描述每頁顯示的記錄的條數(shù)。

PageIndex:當(dāng)前頁的索引值,一般第一頁的索引值為0,當(dāng)然為了表示方便,可以從1開始,并且后面默認為從1開始。

//分頁數(shù)據(jù)源
public IEnumerable<T> DataSource { get;private set; }
//每頁顯示記錄的數(shù)量
public int PageSize { get; private set; }
//當(dāng)前頁數(shù)
public int PageIndex { get; set; }

三,擴展屬性

  有了上述三要素,我們可以推論其他三個重要屬性

PageCount:總頁數(shù),其值取大于或等于 DataSource.Count/PageSize 的最小整數(shù),比如5.2頁,其實就是6頁。

HasPrev:用來判斷是否有上一頁,如果索引 PageIndex 從1開始,那就是判斷 PageIndex > 1 是否成立。

HasNext:用力判斷是否有下一頁,如果索引 PageIndex 從1開始,需判斷 PageIndex < PageCount 是否成立。

//分頁總頁數(shù)
public int PageCount { get;private set; }
//是否有前一頁
public bool HasPrev { get { return PageIndex > 1; } }
//是否有下一頁
public bool HasNext { get { return PageIndex < PageCount; } }

四,核心方法

  最后就是需要實現(xiàn)分頁的核心-獲取分頁數(shù)據(jù)的方法:

GetPagingData():獲取當(dāng)頁的數(shù)據(jù),一般常用的手段是跳過PageIndex*PageSize條記錄,然后取PageSize條數(shù)據(jù)。

  在.NET中有很多方法可以實現(xiàn)這一過程,這里介紹2個最簡單的:

  方法1,從序列的指定位置返回指定數(shù)量的連續(xù)元素:

public static IEnumerable<TSource> Take<TSource>( this IList<TSource> list, int start, int count )
    {
      for ( int index = start; index < Math.Min( start + count, list.Count ); index++ )
      {
        yield return list[index];//yield關(guān)鍵字的用法大家可以參詳其他文章
      }
    }

  那么我們的GetPagingData()方法就要這么寫:

//獲取當(dāng)前頁數(shù)據(jù)
public IEnumerable<T> GetPagingData()
{
    return DataSource.ToList<T>().Take((PageIndex-1)×PageSize,PageSize);
}

  其實我更傾向與第二種方法,就是使用IEnumerable<T>的擴展方法:

Skip(int count):跳過序列中指定數(shù)量的元素,然后返回剩余的元素

Take(int count):從序列的開頭返回指定數(shù)量的連續(xù)元素。

  那么我們的GetPagingData()只需要這么寫就完事:

//獲取當(dāng)前頁數(shù)據(jù)
public IEnumerable<T> GetPagingData()
{
    return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
}

  這句代碼就是跳過 PageIndex - 1) * PageSize 條數(shù)據(jù),再取 PageSize 條數(shù)據(jù) ,剛剛好就是我們需要的當(dāng)前頁的數(shù)據(jù)。

 五,構(gòu)造函數(shù)

  實例化一個分頁器的時候,我們需要對它進行初始化:

  public PagingHelper(int pageSize, IEnumerable<T> dataSource)
        {
            this.PageSize = pageSize > 1 ? pageSize : 1;
            this.DataSource = dataSource;
            PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
        }

  真正的使用中,你可以重寫分頁器類,根據(jù)你的需要來控制哪些字段是只讀的。比如你想隨時改變頁面元素的數(shù)量,那么你可以把PageSize設(shè)置為可讀寫的屬性。

  至此,這個分頁器我們就完工拉。


六,與ASP.NET MVC的簡單結(jié)合

  首先我們通過VS創(chuàng)建一個空的基于Razor視圖引擎的ASP.NET MVC3 Web應(yīng)用程序,命名為JohnConnor.Web

  對創(chuàng)建過程或Razor不太了解的看官,請移步 ASP.NET MVC Razor視圖引擎攻略 <傳送門> ,這里就不再贅述了。

  然后我們需要進行以下幾步

  1,Models文件夾下,添加Student.cs文件,添加以下代碼,為了演示方便這里模擬了一個數(shù)據(jù)源,實際中的數(shù)據(jù)源可能來自數(shù)據(jù)庫。

模擬數(shù)據(jù)源

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public static class Students
    {
        public static IEnumerable<Student> data
        {
            get
            {
                return new List<Student>()
                {
                    new Student{ Id=0, Name="John"},
                    new Student{ Id=1, Name="Marry"},
                    new Student{ Id=2, Name="Andy"},
                    new Student{ Id=3, Name="Tom"},
                    new Student{ Id=4, Name="Lydia"},
                    new Student{ Id=5, Name="Chris"},
                    new Student{ Id=6, Name="Justin"},
                    new Student{ Id=7, Name="Susan"}
                };
            }
        }
    }

  2,Models文件夾下,添加PagingHelper.cs文件,添加我們上述分頁器類。

分頁器Code

public class PagingHelper<T>
    {
        //分頁數(shù)據(jù)源
        public IEnumerable<T> DataSource { get; private set; }
        //每頁顯示記錄的數(shù)量
        public int PageSize { get; private set; }
        //當(dāng)前頁數(shù)
        public int PageIndex { get; set; }
        //分頁總頁數(shù)
        public int PageCount { get; private set; }

        //是否有前一頁
        public bool HasPrev { get { return PageIndex > 1; } }
        //是否有下一頁
        public bool HasNext { get { return PageIndex < PageCount; } }
        //構(gòu)造函數(shù)
        public PagingHelper(int pageSize, IEnumerable<T> dataSource)
        {
            this.PageSize = pageSize > 1 ? pageSize : 1;
            this.DataSource = dataSource;
            PageCount = (int)Math.Ceiling(dataSource.Count() / (double)pageSize);
        }
        //獲取當(dāng)前頁數(shù)據(jù)
        public IEnumerable<T> GetPagingData()
        {
            return DataSource.Skip((PageIndex - 1) * PageSize).Take(PageSize);
        }
    }

  3,在Controller文件夾下添加控制器命名為HomeController,添加以下代碼。

控制器Code

public class HomeController : Controller
    {
        public ActionResult Index(int pageIndex=1)
        {
            PagingHelper<Student> StudentPaging = new PagingHelper<Student>(2, Students.data);//初始化分頁器
            StudentPaging.PageIndex = pageIndex;//指定當(dāng)前頁
            return View(StudentPaging);//返回分頁器實例到視圖
        }
    }

  4,在View文件夾下添加Home文件夾,并新增視圖文件Index.cshtml,添加以下代碼。

視圖Code

@using JohnConnor.Web.Models
@model PagingHelper<Student>
@{
    ViewBag.Title = "Index";
}
<h2>Index</h2>
@foreach (var Data in Model.GetPagingData())
{
    <p>ID:@Data.Id Name:@Data.Name</p>
}
<p>
@if (Model.HasPrev)
{
    <a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex - 1 })">上一頁</a>
}
else
{
    <em style="color:Gray">上一頁</em>
}
@if (Model.HasNext)
{
    <a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex + 1 })">下一頁</a>
}
else
{
      <em style="color:Gray">下一頁</em>
}
</p>

  5,在Global.asax中配置路由,我們修改一下默認路由就可以了。

路由表配置

  public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名稱
                "{controller}/{action}/{pageIndex}", // 帶有參數(shù)的 URL
                new { controller = "Home", action = "Index", pageIndex = UrlParameter.Optional } // 參數(shù)默認值
            );

        }

  現(xiàn)在保存之后F5運行,就可以看到一個簡單的分頁程序了。

  

   URL在進行了路由配置之后,也不會再是http://localhost:1234/Home/Index?pageIndex=1

  而變成了http://localhost:1234/Home/Index/1 這樣的靜態(tài)URL,更簡潔,更美觀。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    第 1 樓 IANA保留地址CZ88.NET 網(wǎng)友 客人 發(fā)表于: 2014/2/11 11:27:58

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)