ASP.NET MVC5 實(shí)現(xiàn)分頁查詢的示例代碼
對(duì)于大量數(shù)據(jù)的查詢和展示使用分頁是一種不錯(cuò)的選擇,這篇文章簡要介紹下自己實(shí)現(xiàn)分頁查詢的思路。
分頁需要三個(gè)變量:數(shù)據(jù)總量、每頁顯示的數(shù)據(jù)條數(shù)、當(dāng)前頁碼。
//數(shù)據(jù)總量 int dataCount; //每頁顯示的數(shù)據(jù)條數(shù) int pageDataCount; int pageNumber;
根據(jù)數(shù)據(jù)總量和每頁顯示的數(shù)據(jù)條數(shù)計(jì)算出總頁數(shù),根據(jù)當(dāng)前頁碼和每頁顯示的數(shù)據(jù)條數(shù)計(jì)算出從數(shù)據(jù)庫中讀取數(shù)據(jù)的起始行號(hào)和結(jié)束行號(hào)。
//總頁數(shù) int pageCount = (int)Math.Ceiling(dataCount/ (pageDataCount* 1.0)); int startLine = (pageNumber - 1) * PageDataCount + 1; int endLine=startLine + PageDataCount - 1;
對(duì)于數(shù)據(jù)庫的查詢操作使用輕量級(jí)ORM框架Dapper來實(shí)現(xiàn),具體代碼如下:
protected IDbConnection CreateConnection()
{
IDbConnection dbConnection = new SqlConnection(ConnectionString);
dbConnection.Open();
return dbConnection;
}
//獲取數(shù)據(jù)庫中數(shù)據(jù)的總條數(shù)
public virtual int QueryDataCount(string tableName)
{
using (IDbConnection dbConnection = CreateConnection())
{
var queryResult = dbConnection.Query<int>("select count(Id) from " + tableName);
if (queryResult == null || !queryResult.Any())
{
return 0;
}
return queryResult.First();
}
}
public virtual IEnumerable<T> RangeQuery<T>(string tableName, int startline, int endline)
{
if (string.IsNullOrEmpty(tableName))
{
throw new ArgumentNullException("表名不得為空或null");
}
if (startline <= 0)
{
throw new ArgumentOutOfRangeException("起始行號(hào)必須大于0");
}
if (endline - startline < 0)
{
throw new ArgumentOutOfRangeException("結(jié)束行號(hào)不得小于起始行號(hào)");
}
using (IDbConnection dbConnection = CreateConnection())
{
var queryResult = dbConnection.Query<T>("select top " + (endline - startline + 1) + " * from " + tableName + " where Id not in (select top " + (startline - 1) + " Id from " + tableName + " order by Id desc) order by Id desc");
if (queryResult != null && queryResult.Any())
{
return queryResult;
}
}
return null;
}
繪制分頁按鈕
在App_Code文件夾中添加PageHelper.cshtml文件封裝繪制按鈕的代碼,這里需要注意一點(diǎn),使用VS發(fā)布站點(diǎn)時(shí)App_Code文件夾中的文件不會(huì)被打包,需要手動(dòng)拷貝App_Code文件夾中的文件到站點(diǎn)中。
@*
amount:數(shù)據(jù)總數(shù),count:每頁顯示的數(shù)據(jù)條數(shù),redierctUrl點(diǎn)擊按鈕時(shí)的跳轉(zhuǎn)鏈接
頁面上需引用:bootstrap.min.css
*@
@helper CreatePaginateButton(int amount, int count, string redirectUrl)
{
<div id="pagenumber" style="position:fixed;bottom:-15px;text-align:center;width:84%">
<nav style="text-align:center">
<ul class="pagination">
<li><a href="@redirectUrl/1" rel="external nofollow" >首頁</a></li>
@{
int pageNumber = (int)Math.Ceiling(amount / (count * 1.0));
pageNumber = pageNumber < 1 ? 1 : pageNumber;
//頁面上顯示的按鈕數(shù)目(不計(jì)首頁、末頁、上一頁、下一頁等按鈕),若頁面總數(shù)超過該值則繪制按鈕分隔符
const int BUTTON_COUNT = 7;
// 按鈕分隔符
const string BUTTON_SEPARATOR = "......";
//按鈕分隔符左側(cè)按鈕數(shù)目(不計(jì)首頁、末頁、上一頁、下一頁等按鈕)
const int LEFT_BUTTON_COUNT = 4;
//按鈕分隔符右側(cè)按鈕數(shù)目(不計(jì)首頁、末頁、上一頁、下一頁等按鈕)
const int RIGHT_BUTTON_COUNT = 2;
string[] urlSegments = Request.Url.Segments;
int selectedIndex = 0;
int.TryParse(urlSegments[urlSegments.Length - 1], out selectedIndex);
int previous = (selectedIndex - 1) <= 0 ? 1 : selectedIndex - 1;
int next = (selectedIndex + 1 > pageNumber) ? pageNumber : selectedIndex + 1;
var r=Request.Cookies[""];
if (pageNumber > BUTTON_COUNT)
{
<li><a id="next" href="@redirectUrl/@previous" rel="external nofollow" >上一頁</a></li>
for (int i = 1; i <= BUTTON_COUNT; i++)
{
if ( selectedIndex >= LEFT_BUTTON_COUNT && selectedIndex%LEFT_BUTTON_COUNT==0 && i <= LEFT_BUTTON_COUNT)
{
<li><a name="pageButton" id="@selectedIndex" href="@redirectUrl/@selectedIndex" rel="external nofollow" >@selectedIndex</a></li>
int step = selectedIndex;
int tag = 0;
for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
{
tag = i + step;
if (tag > pageNumber - RIGHT_BUTTON_COUNT)
{
if (i <= LEFT_BUTTON_COUNT)
{
i = LEFT_BUTTON_COUNT + 1;
}
break;
}
<li><a name="pageButton" id="@tag" href="@redirectUrl/@tag" rel="external nofollow" rel="external nofollow" >@tag</a></li>
}
}
else if (i <= LEFT_BUTTON_COUNT && selectedIndex<LEFT_BUTTON_COUNT)
{
<li><a name="pageButton" id="@i" href="@redirectUrl/@i" rel="external nofollow" rel="external nofollow" >@i</a></li>
}
else if (i < LEFT_BUTTON_COUNT && selectedIndex>LEFT_BUTTON_COUNT)
{
int step = selectedIndex / LEFT_BUTTON_COUNT;
int tag = 0;
<li><a name="pageButton" id="@(step*LEFT_BUTTON_COUNT)" href="@redirectUrl/@(step*LEFT_BUTTON_COUNT)" rel="external nofollow" >@(step*LEFT_BUTTON_COUNT)</a></li>
for (i = 1; i <= LEFT_BUTTON_COUNT; i++)
{
tag = i + step * LEFT_BUTTON_COUNT;
if (tag > pageNumber - RIGHT_BUTTON_COUNT)
{
if (i <= LEFT_BUTTON_COUNT)
{
i = LEFT_BUTTON_COUNT + 1;
}
break;
}
<li><a name="pageButton" id="@tag" href="@redirectUrl/@tag" rel="external nofollow" rel="external nofollow" >@tag</a></li>
}
}
//繪制按鈕分隔符右側(cè)按鈕
if (i==BUTTON_COUNT-1)
{
<li><a name="pageButton" id="@(pageNumber-1)" href="@redirectUrl/@(pageNumber-1)" rel="external nofollow" >@(pageNumber-1)</a></li>
}
else if(i==BUTTON_COUNT)
{
<li><a name="pageButton" id="@pageNumber" href="@redirectUrl/@pageNumber" rel="external nofollow" rel="external nofollow" >@pageNumber</a></li>
}
//繪制按鈕分隔符
else if (i >= BUTTON_COUNT -RIGHT_BUTTON_COUNT)
{
<li><span name="pageButton">@BUTTON_SEPARATOR</span></li>
}
}
<li><a id="next" href="@redirectUrl/@next" rel="external nofollow" >下一頁</a></li>
}
else
{
for (int i = 1; i <= pageNumber; i++)
{
<li><a name="pageButton" id="@i" href="@redirectUrl/@i" rel="external nofollow" rel="external nofollow" >@i</a></li>
}
}
}
<li><a href="@redirectUrl/@pageNumber" rel="external nofollow" rel="external nofollow" >末頁</a></li>
</ul>
</nav>
</div>
<script>
$(function () {
//設(shè)置被選中按鈕的背景色
var selected = $('#@selectedIndex');
if (selected != undefined) {
selected.css('background-color', '#E1E1E1');
}
</script>
}
在前臺(tái)頁面中調(diào)用即可繪制分頁按鈕
@PageHelper.CreatePaginateButton(246, 10, "/usermanager/attentionlist/")
下面是幾張分頁按鈕效果圖:



對(duì)應(yīng)的HTML代碼:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁教程(PagedList.Mvc)
- MVC+jQuery.Ajax異步實(shí)現(xiàn)增刪改查和分頁
- MVC分頁之MvcPager使用詳解
- ASP.NET MVC分頁的實(shí)現(xiàn)方法
- ASP.NET MVC分頁和排序功能實(shí)現(xiàn)
- ASP.NET MVC4 HtmlHelper擴(kuò)展類,實(shí)現(xiàn)分頁功能
- Asp.net MVC 中利用jquery datatables 實(shí)現(xiàn)數(shù)據(jù)分頁顯示功能
- ASP.NET MVC4 Razor模板簡易分頁效果
- ASP.NET MVC+EF在服務(wù)端分頁使用jqGrid以及jquery Datatables的注意事項(xiàng)
- MVC使用MvcPager實(shí)現(xiàn)分頁效果
相關(guān)文章
.NET Core系列之MemoryCache 緩存選項(xiàng)
這篇文章主要介紹了.NET Core系列之MemoryCache 緩存選項(xiàng),詳細(xì)的介紹一下 MSCache 中的 Options,由此來介紹一些 MSCache 中的內(nèi)部機(jī)制,感興趣的小伙伴們可以參考一下2018-08-08
IIS中ASP.NET連接SQL Server出錯(cuò)的解決方法
在IIS中運(yùn)行的ASP.NET應(yīng)用程序其所屬用戶名為ASPNET的特定用戶,其默認(rèn)權(quán)限是無法訪問SQL Server的,更不可能訪問ASP.NET應(yīng)用程序的數(shù)據(jù)庫了,因此要在IIS中訪問SQL Server就需要給ASPNET帳戶賦予相應(yīng)的權(quán)限.2010-03-03
.NET?Core使用?CancellationToken?取消API請(qǐng)求的操作方法
用戶取消請(qǐng)求時(shí),你可以使用HttpContext.RequestAborted訪問,您也可以使用依賴注入將其自動(dòng)注入到您的操作中,這篇文章主要介紹了.NET?Core使用?CancellationToken?取消API請(qǐng)求,需要的朋友可以參考下2024-03-03
Repeater全選刪除和分頁實(shí)現(xiàn)思路及代碼
Repeater控件想必熟悉.net web開發(fā)的人員是很了解不過的了,接下來將與大家共同學(xué)習(xí)下它的全選刪除和分頁,感興趣的你可不要錯(cuò)過了哈,希望可以幫助到你2013-03-03
asp.net DataGrid 中文字符排序的實(shí)現(xiàn)代碼
在論壇上看到有位朋友希望對(duì)中文按拼音進(jìn)行排序,剛好最近有點(diǎn)空,貼一份原來一個(gè)同事寫的一個(gè)排序類,僅稍微改動(dòng)了下下,拿出來分享下.2009-09-09
總結(jié)ASP.NET C#中經(jīng)常用到的13個(gè)JS腳本代碼
本文總結(jié)了ASP.NET C#在實(shí)際開發(fā)過程中13個(gè)JS腳本代碼,方便大家在開發(fā)中使用,希望對(duì)大家有用。2016-04-04
log4net教程日志分類和自動(dòng)維護(hù)示例
log4net能不能按照功能分類呢?如果通過配置不同的logger,然后功能根據(jù)不同的LoggerName加載Ilog實(shí)例,是可以做到。但由于這些功能的log配置差異性極小,也許僅僅就是文件名不同。于是想通過代碼進(jìn)行配置,下面把方法分享如下2014-01-01
Asp.net core中實(shí)現(xiàn)自動(dòng)更新的Option的方法示例
這篇文章主要介紹了Asp.net core中實(shí)現(xiàn)自動(dòng)更新的Option的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

