日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

MVC学习(四)几种分页的实现(3)

發布時間:2025/5/22 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC学习(四)几种分页的实现(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  在這篇MVC學習(四)幾種分頁的實現(2)博文中,根據URL中傳入的兩個參數(頁碼數,首頁、上一頁、下一頁、末頁的標記符)來獲得對應的分頁數據,

只是傳入的參數太多,調用起來不太方便(標記符不能夠寫錯,需要添加新的路由),因此,如果URL只傳入頁碼數就太好,順著這個思路,有了第三種分頁方式。

實現分頁形式如下圖所示。

  下面說說我的思路吧。

  為了在試圖文件中呈現<input type="text" ...> ,我們需要寫上代碼@Html.TextBox(Asp.net MVC 3語法),為了呈現Lable,需要寫@Html.Label,

這里的@Html,有一個管理它的類 HtmlHelper。為了使用方便,我決定對HtmlHelper類進行擴展。

  ?考慮到有些頁面不需要“上一頁”,“下一頁”之間的“100001”,因此,決定由兩種呈現形式,一個是普通的分頁,一個是帶數字的分頁,只有兩種分頁模式,新建一個枚舉類型PageMode,代碼如下

/// <summary>/// 分頁模式/// </summary>public enum PageMode{/// <summary>/// 普通分頁模式/// </summary> Normal,/// <summary>/// 普通分頁加數字分頁/// </summary> Numeric} enum PageMode

  面向對象,對象總是很重要的,因此,頁面對象是首先需要抽象出來的。

 ? 我希望展現的形式是 “總共XX條記錄,共XX頁,當前第X頁 首頁 1 2... 上一頁 下一頁 末頁”,想想這段話中,“記錄數量”,“共多少頁”,“第幾頁”,還有一條隱形“每頁展示數據的大小”,因此,抽象出頁面對象PagerInfo(TotalPageCount可以放入這個類中),代碼如下。

public class PagerInfo{public int RecordCount { get; set; }public int CurrentPageIndex { get; set; }public int PageSize { get; set; }}

  第一步,如何擴展HtmlHelper。

  ?首先,給大家看看微軟如何@Html.Label的代碼,看下面的截圖

   在研究了這段代碼后,就可以寫一個普通的HtmlHelper擴展了,代碼如下

public static MvcHtmlString Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount, object htmlAttributes, string className, PageMode mode){TagBuilder builder = new TagBuilder("table");builder.IdAttributeDotReplacement = "_";builder.GenerateId(id);builder.AddCssClass(className);builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));return builder.ToMvcHtmlString(TagRenderMode.Normal);}

  "string id"表示這個控件的id號,“int currentPageIndex”表示需要顯示第幾頁數據的頁碼,

  “int pageSize"表示每頁顯示數據的大小,”object htmlAttributes“表示屬性, ”string className“表示樣式屬性。

  看了我的HtmlHepler擴展代碼,在與微軟的原始代碼比較以后,會發現我少了一行重要的代碼,就是tagBuilder.SetInnerText(str);“,即控件在View

的呈現形式。無論是asp.net WebForm頁面的服務器控件,還是類似"<input type="text" runat="server">”控件,或者是asp.net MVC的@Html.Label,

他們在頁面的都是以字符串的形式展現。

  有了這個思路,寫出普通的分頁形式就比較簡單了。

  我們只需要給TagBuilder給予正確的字符串就行了。

  1、首先獲得總的記錄數,總頁數

    總記錄數?int pageCount =Convert.ToInt32(Math.Ceiling((double)RecordCount / (double)PageSize));//獲得總頁數

?  2、普通分頁如何實現

   假設我們的url形式為 “http://localhost:11507/Home/FY3?page=2”,那么下一頁的url形式便是“http://localhost:11507/Home/FY3?page=3”,因此,我們需要得到傳來的絕對路徑,不含任何參數。然后根據傳來的當前頁碼數,判斷是否有下一頁,上一頁,并且得到格式化后的url。

?

   這里我先理一理頁碼數如何傳入HtmlHelper中的。

  ?首先,Controller從URL中獲取CurrentPageIndex,然后放入PageInfo對象,并且獲得分頁數據(InfoSource);

   然后,我們將InfoSource與PageInfo兩個對象放入一個泛型容器PagerQuery<T>,返回給View;

   最后,HtmlHelper根據View頁面中的對象獲得所需參數。

  

????? 現在回到HtmlHelper的擴展實現。

  獲得我們需要ULR格式化字符串,如下代碼。

  var url=new StringBuilder();

  url.Append(HttpContext.Current.Request.Url.AbsolutePath+"?page={0}");

  我希望展現的形式是 “總共XX條記錄,共XX頁,當前第X頁 首頁 上一頁 下一頁 末頁”。現在開始拼字符串。

   var sb=new StringBuilder();

   sb.Append("<tr><td>");

   sb.AppendFormat("總共{0}條記錄,共{1}頁,當前第{2}頁&nbsp;&nbsp;",RecordCount,pageCount,currentPageIndex);

  //RecordCount,currentPageIndex 值通過PagerInfo傳遞過來

  if(currentPageIndex==1{

    sb.Append("<span>首頁</span>&nbsp;";)?? //如果第一頁 不需要給首頁真實的鏈接
  }

  else{

    var url1=string.Format(url.ToString(),1);? //格式化URL 得到第一頁的url ??“http://localhost:11507/Home/FY3?page=1”

    sb.AppendFormat("<span><a href={0} 首頁</a></span>&nbsp;",url1);

  }

  如何類推,可得到上一頁、下一頁、末頁的鏈接。

    那么,如果上一頁與下一頁需要顯示數字,怎么辦呢? 這里,默認顯示10個數字(如果頁數不夠,就按實際頁數顯示)

private static string GetNumericPage(int currentPageIndex, int pageSize, int recordCount, int pageCount, string url){var k = currentPageIndex / 10;var m = currentPageIndex % 10;var sb = new StringBuilder();if (currentPageIndex / 10 == pageCount / 10)//10個號碼 為一組 {if (m == 0){k--;m = 10;}elsem = pageCount % 10;}elsem = 10;for (var i = k * 10 + 1; i <= k * 10 + m; i++)//如果是第1頁 則 1...10 第11頁,則11...20//for(int i=currentPageIndex;i<LastPage;i++) {if (i == currentPageIndex)sb.AppendFormat("<span><font color=red><b>{0}</b></font></span>&nbsp;", i);else{var url1 = string.Format(url, i);sb.AppendFormat("<span><a href={0}>{1}</a></span>&nbsp;", url1, i);}}return sb.ToString();}} string GetNumericPage

    現在,可以得到擴展標簽代碼,如下

public static MvcHtmlString Pager(this HtmlHelper helper, string id, int currentPageIndex, int pageSize, int recordCount, object htmlAttributes, string className, PageMode mode){TagBuilder builder = new TagBuilder("table");builder.IdAttributeDotReplacement = "_";builder.GenerateId(id);builder.AddCssClass(className);builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));builder.InnerHtml = GetNormalPage(currentPageIndex, pageSize, recordCount, mode);return builder.ToMvcHtmlString(TagRenderMode.Normal);}static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode){return new MvcHtmlString(tagBuilder.ToString(renderMode));}

    得到分頁字符串代碼了,如下

private static string GetNormalPage(int currentPageIndex, int PageSize, int RecordCount, PageMode mode){int pageCount =Convert.ToInt32(Math.Ceiling((double)RecordCount / (double)PageSize));//獲得總頁數var url = new StringBuilder();url.Append(HttpContext.Current.Request.Url.AbsolutePath + "?page={0}");var sb = new StringBuilder();sb.Append("<tr><td>");sb.AppendFormat("總共{0}條記錄,共{1}頁,當前第{2}頁&nbsp;&nbsp;", RecordCount, pageCount, currentPageIndex);if (currentPageIndex == 1)sb.Append("<span>首頁</span>&nbsp;");else{var url1 = string.Format(url.ToString(), 1);sb.AppendFormat("<span><a href={0}>首頁</a></span>&nbsp;", url1);}if (currentPageIndex > 1){var url1 = string.Format(url.ToString(), currentPageIndex - 1);sb.AppendFormat("<span><a href={0}>上一頁</a></span>&nbsp;", url1);}elsesb.Append("<span>上一頁</span>&nbsp;");if (mode == PageMode.Numeric)sb.Append(GetNumericPage(currentPageIndex, PageSize, RecordCount, pageCount, url.ToString()));if (currentPageIndex < pageCount){string url1 = string.Format(url.ToString(), currentPageIndex + 1);sb.AppendFormat("<span><a href={0}>下一頁</a></span>&nbsp;", url1);}elsesb.Append("<span>下一頁</span>&nbsp;");if (currentPageIndex == pageCount)sb.Append("<span>末頁</span>&nbsp;");else{string url1 = string.Format(url.ToString(), pageCount);sb.AppendFormat("<span><a href={0}>末頁</a></span>&nbsp;", url1);}return sb.ToString();} GetNormalPage(int currentPageIndex, int PageSize, int RecordCount, PageMode mode)

   那么,承載數據的容器時什么呢,因為Model是會隨時變化的(泛型類最佳實現),代碼如下

public class PagerQuery<T> : List<T>{public PagerQuery(PagerInfo pager, IEnumerable<T> source){this.Pager = pager;int BeforePageIndex = pager.CurrentPageIndex - 1;if (BeforePageIndex < 0){BeforePageIndex = 1;}var entityList = source.Skip((BeforePageIndex) * pager.PageSize).Take(pager.PageSize);AddRange(entityList);}public PagerInfo Pager { get; set; }}

   Controller代碼如下

public ActionResult FY2(int? page){LZSEntities _lzsDb=new LZSEntities();PagerInfo pager = new PagerInfo();pager.RecordCount = _lzsDb.MyTestPages.Count();pager.PageSize = 5;if (page == null){pager.CurrentPageIndex = 1;}else{pager.CurrentPageIndex = Convert.ToInt32(page);}var result = _lzsDb.MyTestPages;IEnumerable<MyTestPages> info2 = result;var query = new PagerQuery<MyTestPages>(pager, info2);return View(query);} public ActionResult FY2(int? page)

   View代碼如下

@model MVCFY2.PageHelpers.PagerQuery<MVCFY2.Models.MyTestPages> @using MVCFY2.Models @using MVCFY2.PageHelpers; @{Layout = null; }<!DOCTYPE html><html><head><title>FY3</title></head> <body> @* ReSharper disable once Html.Obsolete *@<table cellpadding="0" cellspacing="0" height="200px" width="300px" bordercolor="blue"><tr><th height="30px">序號</th></tr>@foreach (var item in Model){<tr><td align="center" height="30px">@item.Id</td></tr>}</table><div><p> @Html.Pager("pager1", Model.Pager.CurrentPageIndex, Model.Pager.PageSize, Model.Pager.RecordCount, PageMode.Numeric)</p></div> </body> </html> View

? VS 2010 MVC3,配置好數據庫后,運行即可,源代碼點此下載。

  我感覺,第三種分頁形式是很完美的,只是重復從第一頁跳到最后一頁再最后一頁跳至第一頁,分頁緩慢,查看資源管理器,內存被占了很多,未曾釋放,因此,

希望各位可以告訴我高效的改進方法~~~

  ?

轉載于:https://www.cnblogs.com/xianrongbin/p/3487807.html

總結

以上是生活随笔為你收集整理的MVC学习(四)几种分页的实现(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 超碰午夜 | 亚洲久久影院 | 中文字幕四区 | 自由 日本语 热 亚洲人 | 日韩精品在线免费视频 | 少妇高潮露脸国语对白 | 337p日本欧洲亚洲大胆精筑 | 天天玩天天干 | 国产精品不卡一区二区三区 | av不卡高清 | 亚洲精品久久久久久宅男 | 伊人网站在线观看 | 韩国美女被c | 成人无码久久久久毛片 | 欧美日韩精品在线视频 | 久久不射电影网 | 国产亚洲av片在线观看18女人 | 三级全黄做爰在线观看 | 日韩欧美精品在线观看 | 天天射夜夜操 | 日本丰满少妇 | 久久久久亚洲精品国产 | 久久看av | 久久久久久av无码免费网站 | 午夜视频一区二区 | 人妻一区二区三区 | 国产日韩av在线播放 | 污污视频在线播放 | 成人免费黄色网址 | 国产福利小视频在线 | 欧美综合色 | 亚洲女同一区二区 | 日本乱大交xxxx公交车 | 日韩高清影院 | 国产无遮挡免费视频 | 免费av福利| 精品人妻一区二区三区日产 | 国产女人18毛片水18精 | 高跟丝袜av | 欧美韩日精品 | 中文字幕不卡av | av一级久久| 37p粉嫩大胆色噜噜噜 | 天天躁日日躁狠狠躁喷水 | 欧美一级大片在线观看 | 穿扒开跪着折磨屁股视频 | 大尺度一区二区 | 成人网站免费观看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国模精品一区二区三区 | 日韩av综合| 色干干| 91视频h| 秋霞三区| 精品人成 | 性囗交免费视频观看 | 久久噜噜噜精品国产亚洲综合 | 四虎永久在线视频 | 综合亚洲网 | 男人用嘴添女人下身免费视频 | 国产伦理久久精品久久久久 | 伊人久久免费视频 | 疯狂做爰的爽文多肉小说王爷 | 国产女人叫床高潮大片免费 | 重口另类 | 国产精品剧情 | 好吊色网站 | 免费三片在线观看网站v888 | 亚洲黄色在线看 | 亚洲精品电影 | 高清av免费观看 | 中文久久精品 | 久久久水蜜桃 | 91久久亚洲 | 在线a视频 | 久久av资源| 欧亚一区二区三区 | 久久精品国产欧美亚洲人人爽 | 狠狠v欧美v日韩v亚洲ⅴ | 欧美特黄一级视频 | 中国女人做爰视频 | 国产一区二区三区自拍 | 国产黄色精品网站 | 成年人在线免费 | 人人爽人人射 | 天堂婷婷 | 色哟哟网站在线观看 | av在线播放网址 | 天天草天天干 | 91久久精品一区二区 | 日韩卡一卡二 | 亚洲精品第一页 | 亚洲精品国产精品国自产 | 欧美极品少妇×xxxbbb | 国产成人免费 | 国产亚洲精品久久 | 女性裸体无遮挡胸 | 好妞色妞国产在线视频 | 亚洲免费中文字幕 |