我正在使用twitter bootstrap分页在ASP.net MVC中实现Paging。我正在关注这个网站 实现它http://afana.me/post/paging-sorting-and-searching-ef-cf-and-mvc.aspx但如果页数超过11则会出错,那么它不能隐式地将类型'double'转换为'int'。在计算pagesAfter和Pagesbefore时存在显式转换(你是否错过了演员?),其次是我要激活用户点击的当前链接。我使用的代码如下:
Index.cshtml
@model IEnumerable<MvcPagingConcept.Models.tbl_product>
@{
Layout = null;
}
<link href="@Url.Content("~/bootstrap/css/bootstrap.min.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/bootstrap/js/bootstrap.min.js")" type="text/javascript"></script>
@helper buildLinks(int start, int end, string innerContent)
{
for (int i = start; i <= end; i++)
{
<li><a class="@(i == ViewBag.CurrentPage ? "current" : "")" href="@Url.Action("Index", "Home", new { page = i })">@(innerContent ?? i.ToString())</a> </li>
}
}
@helper pageLinks()
{
const int maxPages = 11;
if (ViewBag.TotalPages <= maxPages)
{
@buildLinks(1, (int)ViewBag.TotalPages, null)
return;
}
int pagesAfter = ViewBag.TotalPages - ViewBag.CurrentPage; // Number of pages after current
int pagesBefore = ViewBag.CurrentPage - 1; // Number of pages before current
if (pagesAfter <= 4)
{
@buildLinks(1, 1, null) // Show 1st page
int pageSubset = ViewBag.TotalPages - maxPages - 1 > 1 ? ViewBag.TotalPages - maxPages - 1 : 2;
@buildLinks(pageSubset, pageSubset, "...") // Show page subset (...)
@buildLinks(ViewBag.TotalPages - maxPages + 3, ViewBag.TotalPages, null) // Show last pages
return; // Exit
}
if (pagesBefore <= 4)
{
@buildLinks(1, maxPages - 2, null) // Show 1st pages
int pageSubset = maxPages + 2 < ViewBag.TotalPages ? maxPages + 2 : ViewBag.TotalPages - 1;
@buildLinks(pageSubset, pageSubset, "...") // Show page subset (...)
@buildLinks(ViewBag.TotalPages, ViewBag.TotalPages, null) // Show last page
return; // Exit
}
if (pagesAfter > 4)
{
@buildLinks(1, 1, null) // Show 1st pages
int pageSubset1 = ViewBag.CurrentPage - 7 > 1 ? ViewBag.CurrentPage - 7 : 2;
int pageSubset2 = ViewBag.CurrentPage + 7 < ViewBag.TotalPages ? ViewBag.CurrentPage + 7 : ViewBag.TotalPages - 1;
@buildLinks(pageSubset1, pageSubset1, pageSubset1 == ViewBag.CurrentPage - 4 ? null : "...") // Show 1st page subset (...)
@buildLinks(ViewBag.CurrentPage - 3, ViewBag.CurrentPage + 3, null) // Show middle pages
// Show 2nd page subset (...)
// only show ... if page is contigous to the previous one.
@buildLinks(pageSubset2, pageSubset2, pageSubset2 == ViewBag.CurrentPage + 4 ? null : "...")
@buildLinks(ViewBag.TotalPages, ViewBag.TotalPages, null) // Show last page
return; // Exit
}
}
<h2 class="center">Products</h2>
<table class="products">
<tr>
<th>ID</th>
<th>Name</th>
<th>Description</th>
</tr>
@{int i = 1;}
@foreach (var p in Model)
{
<tr class="@(i++ % 2 == 0 ? "highlighted" : "")">
<td>@p.ProductId</td>
<td>@p.ProductName</td>
<td>@p.ProductDesc</td>
</tr>
}
</table>
<div class="pagination">
<ul>
@pageLinks()
</ul>
</div>
HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcPagingConcept.Models;
namespace MvcPagingConcept.Controllers
{
public class HomeController : Controller
{
ProductEntities prdEntity = new ProductEntities();
const int pageSize = 3;
[HttpGet]
public ActionResult Index(int page = 1)
{
var products = prdEntity.tbl_product.OrderBy(p => p.ProductId).Skip((page - 1) * pageSize).Take(pageSize).ToList();
ViewBag.CurrentPage = page;
ViewBag.PageSize = pageSize;
ViewBag.TotalPages=Math.Ceiling((double)prdEntity.tbl_product.Count() / pageSize);
return View(products);
}
}
}