日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

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

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

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

      作者:佚名點(diǎn)擊:763次評(píng)論:0次標(biāo)簽: ASP.NET

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

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

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

      一,定義分頁(yè)器類

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

      public class PagingHelper<T>

      二,基本三要素

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

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

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

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

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

      三,擴(kuò)展屬性

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

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

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

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

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

      四,核心方法

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

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

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

        方法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)前頁(yè)數(shù)據(jù)
      public IEnumerable<T> GetPagingData()
      {
          return DataSource.ToList<T>().Take((PageIndex-1)×PageSize,PageSize);
      }

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

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

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

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

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

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

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

        實(shí)例化一個(gè)分頁(yè)器的時(shí)候,我們需要對(duì)它進(jìn)行初始化:

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

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

        至此,這個(gè)分頁(yè)器我們就完工拉。


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

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

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

        然后我們需要進(jìn)行以下幾步

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

      模擬數(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文件,添加我們上述分頁(yè)器類。

      分頁(yè)器Code

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

              //是否有前一頁(yè)
              public bool HasPrev { get { return PageIndex > 1; } }
              //是否有下一頁(yè)
              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)前頁(yè)數(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);//初始化分頁(yè)器
                  StudentPaging.PageIndex = pageIndex;//指定當(dāng)前頁(yè)
                  return View(StudentPaging);//返回分頁(yè)器實(shí)例到視圖
              }
          }

        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 })">上一頁(yè)</a>
      }
      else
      {
          <em style="color:Gray">上一頁(yè)</em>
      }
      @if (Model.HasNext)
      {
          <a href="@Url.Action("Index", "Home", new { pageIndex = Model.PageIndex + 1 })">下一頁(yè)</a>
      }
      else
      {
            <em style="color:Gray">下一頁(yè)</em>
      }
      </p>

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

      路由表配置

        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ù)默認(rèn)值
                  );

              }

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

        

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

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

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

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

        熱門評(píng)論

        最新評(píng)論

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

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

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

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