激活当前页面链接并在ASP.net MVC和Bootstrap Paging中显示有限数量的链接

时间:2013-12-09 08:30:43

标签: c# asp.net asp.net-mvc asp.net-mvc-4 twitter-bootstrap

我正在使用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);
        }
    }
}

0 个答案:

没有答案