成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解ASP.NET MVC分頁(yè)的實(shí)現(xiàn)方法

開(kāi)發(fā) 后端
這里將詳細(xì)介紹ASP.NET MVC分頁(yè)的實(shí)現(xiàn)方法,一般來(lái)說(shuō)分頁(yè)的實(shí)現(xiàn)只能靠程序員自己來(lái)設(shè)計(jì),希望本文對(duì)大家有所幫助。

ASP.NET MVC分頁(yè)已經(jīng)有很多文章講述過(guò),這里我們將講述的ASP.NET MVC分頁(yè)的實(shí)現(xiàn),需要靠自己設(shè)計(jì),這就需要了解分頁(yè)的原理,以及相關(guān)數(shù)據(jù)庫(kù)的操作。51CTO編輯推薦《ASP.NET MVC框架視頻教程

在ASP.NET中,GridView控件本身就帶有分頁(yè)的功能,只要把當(dāng)前頁(yè)面的索引值賦給GridView的PageIndex就可以實(shí)現(xiàn)了分頁(yè),至于數(shù)據(jù)怎么分頁(yè),全都由GridView封裝起來(lái)了。

ASP.NET MVC分頁(yè)的實(shí)現(xiàn)就只能靠自己來(lái)設(shè)計(jì)了。首先來(lái)說(shuō)一下分頁(yè)的原理。現(xiàn)在有一個(gè)張news表,中間有很多信息,我們假設(shè)一頁(yè)顯示5條記錄,這樣,頁(yè)面數(shù)量=總記錄數(shù)/5;這里,如果出現(xiàn)小數(shù),得進(jìn)位取整。如比總記錄和數(shù)為51,那么分的頁(yè)面數(shù)量是11,最后一頁(yè)只有一條記錄。好,有這樣一個(gè)思路后,現(xiàn)在就來(lái)做ASP.NET MVC中的分頁(yè)了。

1、 數(shù)據(jù)庫(kù)和表

創(chuàng)建一個(gè)Data_Company的數(shù)據(jù)庫(kù),建一張news表,表結(jié)構(gòu)如下圖:

創(chuàng)建一個(gè)Data_Company的數(shù)據(jù)庫(kù)

ID是主鍵,并助是自動(dòng)增長(zhǎng)列。

2、 現(xiàn)在,我們用O/R Designer來(lái)創(chuàng)建news表的LINQ To SQL的實(shí)體類(lèi)。

創(chuàng)建一個(gè)名為MvcCompany的ASP.NET MVC Web Application項(xiàng)目,然后選中Models,右鍵,“添加”,“新建項(xiàng)”,選中C#中的“數(shù)據(jù)”,如下圖:

用O/R Designer來(lái)創(chuàng)建news表

選擇“LINQ to SQL類(lèi)”,名稱(chēng)設(shè)為“CompanyData.dbml”,然后“添加”。

打開(kāi)“服務(wù)器資源管理器”,創(chuàng)建連接,展開(kāi)表,找到news表,拖到CompanyData.dbml的左邊表視圖區(qū)(注:.dbml視圖左邊是SQL表和SQL視圖區(qū),右邊是SQL存儲(chǔ)過(guò)程和SQL函數(shù)區(qū)),效果如下圖:

服務(wù)器資源管理器

在“解決方案資源管理器”下的,“Models”多了三個(gè)文件,CompanyData.dbml,展開(kāi)它,會(huì)有CompanyData.dbml.layout和CompanyData.designer.cs,前者是CompanyData.dbml視圖的一些信息(比如news表在的坐標(biāo)等信息),后者是news實(shí)體類(lèi)及Data_Company數(shù)據(jù)庫(kù)的類(lèi),在數(shù)據(jù)庫(kù)類(lèi)中聚合了news實(shí)體類(lèi)。

3、 添加news列表類(lèi)。因?yàn)橐粋€(gè)news實(shí)體類(lèi),一次只能表示一條記錄,如果呈現(xiàn)一個(gè)news表中的數(shù)據(jù),最好定義一個(gè)集合類(lèi)來(lái)存臨時(shí)來(lái)存放news記錄的集合。

類(lèi)的實(shí)現(xiàn)如下:

  1. using System;  
  2.  using System.Collections.Generic;  
  3.  using System.Linq;  
  4.  using System.Web;  
  5.  namespace MvcCompany.Models  
  6. {  
  7. public class NewList<T> : List<T> 
  8. {  
  9. /**//// <summary> 
  10. /// 頁(yè)面索引值  
  11. /// </summary> 
  12. public int PageIndex { get; private set; }  
  13. /**//// <summary> 
  14. /// 每頁(yè)記錄的數(shù)量  
  15. /// </summary> 
  16. public int PageSize { get; private set; }  
  17. /**//// <summary> 
  18. /// 記錄總條數(shù)  
  19. /// </summary> 
  20. public int TotalCount { get; private set; }  
  21. /**//// <summary> 
  22. /// 共有的頁(yè)數(shù)和  
  23. /// </summary> 
  24. public int TotalPages { get; private set; }  
  25. public NewList(IQueryable<T> source, int pageIndex, int pageSize)  
  26. {  
  27. PageIndex = pageIndex;  
  28. PageSize = pageSize;  
  29. TotalCount = source.Count();  
  30. // 進(jìn)上去取整( 總記錄條數(shù)/一面記錄的條數(shù))  
  31. TotalPages = (int)Math.Ceiling(TotalCount / (double)pageSize);  
  32. this.AddRange(source.Skip(pageIndex * pageSize).Take(PageSize));  
  33. }  
  34. /**//// <summary> 
  35. /// 是否存在前續(xù)頁(yè)  
  36. /// </summary> 
  37. public bool HasPreviousPage  
  38. {  
  39. get { return (PageIndex > 0); }  
  40. }  
  41. /**//// <summary> 
  42. /// 是否存在后續(xù)頁(yè)  
  43. /// </summary> 
  44. public bool HasNextPage  
  45. {  
  46. get { return (PageIndex + 1 < AllPages); }  
  47. }  
  48. }} 

這里,我們實(shí)現(xiàn)了一個(gè)泛型的集合列表NewList(當(dāng)然,這里的本質(zhì)上可以當(dāng)其他實(shí)體類(lèi)的集合列表),在這個(gè)類(lèi)中間,有四個(gè)字段,訪(fǎng)問(wèn)修飾符都是public的,分另為:

PageIndex:當(dāng)前頁(yè)面的索引值

PageSize:每個(gè)頁(yè)面的記錄的條數(shù)

AllCount:記錄的總條數(shù)

AllPages:共有的頁(yè)面總數(shù)

在NewList 構(gòu)造函數(shù)中,有如下代碼:

  1. public NewList(IQueryable<T> list, int pageIndex, int pageSize)  
  2. {  
  3. PageIndex = pageIndex;   
  4.  PageSize = pageSize;  
  5. AllCount = source.Count();   
  6. AllPages = (int)Math.Ceiling(AllCount / (double)pageSize);  
  7. this.AddRange(list.Skip(PageIndex * PageSize).Take(PageSize));  

構(gòu)造函的參數(shù)有三個(gè),一個(gè)是list,就是實(shí)體類(lèi)的一個(gè)集合,還有就是頁(yè)面索引值和每個(gè)頁(yè)面的記錄條數(shù)。

第1、2代碼很容易理角,第3行代碼是得到列表的總記錄條數(shù),第4行代碼,就完成了我們?cè)陂_(kāi)始時(shí)分析的分頁(yè)實(shí)現(xiàn)的公式:頁(yè)面數(shù)量=總記錄數(shù)/每頁(yè)記錄數(shù),其中Math.Ceiling就是把小數(shù)部分進(jìn)到整數(shù)的函數(shù)。

最關(guān)鍵的是第5行代碼,首先看Skip(PageIndex*PageSize),頁(yè)面索引值乘上每頁(yè)記錄數(shù),得到是當(dāng)前頁(yè)面以前的所有記錄數(shù),Skip是跳過(guò)這些記錄,而得到后面的所有記錄,Take(PageSize)是得到PageSize條數(shù)的記錄,比如,我們想要第三頁(yè)的記錄,這個(gè)頁(yè)面的索引值為2(因?yàn)樗饕祻?開(kāi)始)PageIndex=2,每頁(yè)顯示5條記錄,PageSize=5,就是要跳過(guò)list中的前10條記錄,然后再取前5條記錄,即取list中的第11條到第15條記錄,也就是第3頁(yè)的記錄了。

在這里,微軟提供了Skip和Tabke函數(shù),讓我們做起分頁(yè)來(lái),得心應(yīng)手。

接下來(lái)是this.AddRange()函數(shù),可以把批量的數(shù)據(jù)放到當(dāng)前集合中(因?yàn)镹ewList本身就是一個(gè)集合)。

代碼的后半部分是兩個(gè)屬性:

  1. public bool HasPreviousPage  
  2. {  
  3. get { return (PageIndex > 0); }  
  4. }  
  5. public bool HasNextPage  
  6. {  
  7. get { return (PageIndex + 1 < AllPages); }  

這兩個(gè)屬性是為頁(yè)面顯示“上一頁(yè)”和“下一頁(yè)”,因?yàn)楫?dāng)我們顯示第一頁(yè)的時(shí)候,“上一頁(yè)”是不需要顯示的,如果最后一頁(yè),是沒(méi)有“下一頁(yè)“的,所以在這里定義了兩個(gè)屬性,來(lái)判斷是否有上一頁(yè)和下一頁(yè)。

先看HasPreviousPage屬性,如果PageIndex是大于0的,說(shuō)明不是在第一頁(yè),所以就反回true,如果小于等于0(在這里小于0是沒(méi)有意思義的,因?yàn)轫?yè)面的索引值最小是0),說(shuō)明是第一頁(yè),所以返回是false。

再看HasNextPage屬性,因?yàn)轫?yè)面索引值的最大數(shù),與頁(yè)面的最大數(shù)差1(索引從0開(kāi)始的原因),所以當(dāng)PageIndex+1小于AllPages時(shí),說(shuō)沒(méi)有沒(méi)到最后一頁(yè),返回值是true,如果PageIndex+1大于等于AllPages時(shí)(大于也沒(méi)有意義),說(shuō)明是最后一頁(yè),返回值為false。

4、 添加NewsController。選中Controller,右鍵添加一個(gè)NewsController 的Controller。

代碼如下:

  1. using System;  
  2.  using System.Collections.Generic;  
  3.  using System.Linq;  
  4.  using System.Web;  
  5. using System.Web.Mvc;  
  6. using System.Web.Mvc.Ajax;  
  7. using MvcCompany.Models;  
  8. using System.Configuration;  
  9. namespace MvcCompany.Controllers  
  10. {  
  11. public class NewsController : Controller  
  12. {  
  13. DataClassesDataContext DCDC;  
  14. int pageSize;  
  15. public NewsController()  
  16. {  
  17. DCDC = new DataClassesDataContext();  
  18. pageSize = Convert.ToInt32(ConfigurationManager.AppSettings["pagesize"]); //每個(gè)頁(yè)面的數(shù)量存放在web.config的appsetting里的pagesize節(jié)中,值為5  
  19. }  
  20. public ActionResult Index(int? page)  
  21. {  
  22. var NewsList = DCDC.news.Select(newss=>newss);  
  23. var paginatedNews = new NewList<news>(NewsList, page ?? 0, pageSize); //實(shí)現(xiàn)分頁(yè)功能  
  24. return View(paginatedNews);  
  25. }  
  26. [AcceptVerbs(HttpVerbs.Post)]  
  27. public ActionResult Index(FormCollection formValues)  
  28. {  
  29. int? index = int.Parse(formValues.GetValue("pageindex").AttemptedValue);  
  30. int page = index ??0 ;  
  31. var NewsList = DCDC.news.Select(newss => newss);  
  32. var paginatedNews = new NewList<news>(NewsList, page, pageSize); //實(shí)現(xiàn)分頁(yè)功能  
  33. return View(paginatedNews);  
  34. }  
  35. }  
  36. }  

關(guān)于兩個(gè)Index重載,我們?cè)谠O(shè)計(jì)完Views再討論。

5、 添加View。選中NewsController,右鍵,添加View,會(huì)彈出如下圖:

添加View

在這里,我們選中MvcCompany.Models.news,在View content下拉列表中選擇List(因?yàn)橐獙?shí)現(xiàn)列表分頁(yè))。

Index.aspx頁(yè)面代碼如下:

  1. <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcCompany.Models.NewList<MvcCompany.Models.news>>" %> 
  2. <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
  3. 新聞  
  4. </asp:Content> 
  5. <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
  6. <!--前半部分--> 
  7. <%using (Html.BeginForm())  
  8. { %> 
  9. <h2> 
  10. 新聞列表</h2> 
  11. <table> 
  12. <tr> 
  13. <th> 
  14. 編號(hào)  
  15. </th> 
  16. <th> 
  17. 題目  
  18. </th> 
  19. <th> 
  20. 時(shí)間  
  21. </th> 
  22. <th> 
  23. 內(nèi)容  
  24. </th> 
  25. </tr> 
  26. <% foreach (var item in Model)  
  27. { %> 
  28. <tr> 
  29. <td> 
  30. <%= Html.Encode(item.ID)%> 
  31. </td> 
  32. <td> 
  33. <%= Html.Encode(item.title)%> 
  34. </td> 
  35. <td> 
  36. <%= Html.Encode(String.Format("{0:g}", item.datetimes))%> 
  37. </td> 
  38. <td> 
  39. <%= Html.Encode(item.contents)%> 
  40. </td> 
  41. </tr> 
  42. <% } %> 
  43. </table> 
  44. <hr /> 
  45. <!--后半部分--> 
  46. <% =Html.RouteLink("首頁(yè)", "UpcomingNews", new { page = 0 })%>|  
  47. <% if (Model.HasPreviousPage)  
  48. {%> 
  49. <% =Html.RouteLink("上一頁(yè)", "UpcomingNews", new { page = (Model.PageIndex - 1) })%>|  
  50. <%} %> 
  51. <% if (Model.HasNextPage)  
  52. {%> 
  53. <% =Html.RouteLink("下一頁(yè)", "UpcomingNews", new { page = (Model.PageIndex + 1) })%>|  
  54. <%} %> 
  55. <% =Html.RouteLink("尾頁(yè)", "UpcomingNews", new { page = Model.PageSize - 1 })%>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
  56. 第  
  57. <%=Html.TextBox("pageindex", Model.PageIndex, new {style="width:30px;"})%>頁(yè)<input 
  58. type="submit" value="轉(zhuǎn)到" id="sub" /> 
  59. <%} %> 
  60. </asp:Content> 

代碼的前半部分,很好理解。

代碼的后半部分,我們來(lái)分析一下,首頁(yè),是采用

Html.RouteLink(“首頁(yè)”,”UpcomingNews”,new{ page=0}),是要定位到名稱(chēng)為”UpcomingNews”的路由,這個(gè)路由在Global.asax中,代碼如下:

  1. routes.MapRoute(  
  2. "UpcomingNews",  
  3. "News/page/{page}",  
  4. new { controller = "News"action = "Index" }); 

路由的名稱(chēng)是”UpcominNews”,Url格式是News/page/{page},News和page是url的一種格式,后面{page}是參數(shù),這個(gè)參數(shù)的名稱(chēng)要與View中,后半部分的new{page=0}的page,以及NewsController中的方法Index(int? page)中的page都必需統(tǒng)一。如果有請(qǐng)求

News/page/2的url,實(shí)際上請(qǐng)求的是 news?page=2的頁(yè)網(wǎng)(路由在ASP.NET MVC官上有說(shuō)明)。

首頁(yè)為中的page=0,最終會(huì)成為NesController中Index(int? page)方法,的實(shí)參,返回首頁(yè)數(shù)據(jù)(及數(shù)據(jù)庫(kù)表的前5條數(shù)據(jù))。

上一頁(yè),在當(dāng)前頁(yè)數(shù)PageIndex的基礎(chǔ)上減1。

下一頁(yè),在當(dāng)前頁(yè)數(shù)PageIndex的基礎(chǔ)上加1

(注:上面的加減1都不會(huì)越界,因?yàn)楫?dāng)顯示第一頁(yè)時(shí),“上一頁(yè)”的超連接就不會(huì)顯示。當(dāng)最后一頁(yè)時(shí),“下一頁(yè)”的超連接就不會(huì)顯示)

尾頁(yè)同首頁(yè)。

現(xiàn)在的一個(gè)問(wèn)題是“轉(zhuǎn)到”第幾頁(yè)的實(shí)現(xiàn),我們知道,轉(zhuǎn)到第幾頁(yè)的“幾”,得用戶(hù)輸入,所以這里用一個(gè)Html.TextBox來(lái)實(shí)現(xiàn),完全代碼是

  1. <%=Html.TextBox("pageindex", Model.PageIndex, new {style="width:30px;"})%> 

最終會(huì)生成一個(gè)名稱(chēng)為pageindex的intup,類(lèi)型為T(mén)ext,它的值始終為當(dāng)前的索引頁(yè)值Model.PageIndex,其中有一個(gè)寬度的屬性new {style="width:30px;"}。

同時(shí)還有一個(gè)<input type="submit" value="轉(zhuǎn)到" id="sub" />用來(lái)向后參提交。因?yàn)榇a中有<form>表單,所以可以在NewsController中接收這個(gè)提交。

Index(FormCollection formValues)方法用來(lái)處理這個(gè)提交。這里會(huì)從formValues.GetValue("pageindex").AttemptedValue中午到客戶(hù)端用戶(hù)輸入“pageindex”文本框中的值。從而來(lái)完成定向。

至此,我們就用ASP.NET MVC實(shí)現(xiàn)了一個(gè)分頁(yè)功能,相比之下要難ASP.NET的GridView自動(dòng)分頁(yè)好多。

在這個(gè)例子中,我們?cè)贛odels層中提供了實(shí)體類(lèi)及news表的集合類(lèi)。在Controller層增加了NewsController類(lèi)。在View層增加了News的view,從M-V-C角度,分別完成了對(duì)分頁(yè)的功能。

【編輯推薦】

  1. ASP.NET靜態(tài)頁(yè)面生成及分頁(yè)的實(shí)現(xiàn)
  2. ASP.NET GridView分頁(yè)與雙向排序案例
  3. ASP.NET DataGrid自定義分頁(yè)源程序
  4. ASP.NET MVC分頁(yè)控件的實(shí)現(xiàn)
  5. DetailsView分頁(yè)顯示數(shù)據(jù)
責(zé)任編輯:彭凡 來(lái)源: 51CTO博客
相關(guān)推薦

2010-03-19 09:17:16

ASP.NET MVC

2009-07-28 14:47:18

ASP.NET MVC

2009-07-22 16:02:39

ASP.NET MVCPagedList

2010-01-26 13:15:42

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-10-29 09:15:32

ASP.NET MVCDropDownLis

2009-09-18 10:20:26

PRG數(shù)據(jù)驗(yàn)證

2010-08-02 09:18:39

ASP.NET MVC

2009-12-01 09:30:34

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2009-07-22 09:36:54

使用UpdataModASP.NET MVC

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2009-07-24 13:20:44

MVC框架ASP.NET

2010-02-03 09:50:58

ASP.NET MVC

2009-09-11 09:18:17

ASP.NET MVC

2010-10-12 09:52:02

ASP.NET MVC

2010-01-18 09:25:33

ASP.NET MVC

2009-11-06 09:23:41

ASP.NET高效分頁(yè)

2011-04-14 09:19:22

ASP.NET MVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久国产精品免费 | 亚洲久草| 国产精品久久久久久久久久久免费看 | 不卡视频一区二区三区 | 精品一二区 | 99爱在线视频 | 婷婷色成人 | 国产精品久久久久影院色老大 | 国产九九精品 | 国产精品99久久久久久久vr | 日本不卡高字幕在线2019 | 亚洲精彩视频在线观看 | 国产高清精品一区二区三区 | 欧美精品久久久久久久久久 | 亚洲成人自拍网 | 91免费版在线观看 | 色悠悠久 | 亚洲一区二区三区视频 | 日韩午夜影院 | 精品国产视频 | 中文字幕 欧美 日韩 | 亚洲国产第一页 | www亚洲精品 | 51ⅴ精品国产91久久久久久 | 午夜影院操| 亚洲v区 | www.色五月.com| 欧美一区二区 | 蜜桃传媒av | 一区二区三区在线 | 欧 | 女朋友的闺蜜3韩国三级 | 精品99在线 | 亚洲iv一区二区三区 | www.黄网| 成人黄色电影免费 | 日本电影韩国电影免费观看 | 亚洲人成人一区二区在线观看 | 免费在线黄色av | 国产91精品久久久久久久网曝门 | 精品欧美一区二区久久久伦 | 成人精品在线观看 |