跟蓝狐学MVC教程--ASP.NET MVC分页组件PagedList.Mvc在EF中的使用方法

跟蓝狐学MVC教程--ASP.NET MVC分页组件PagedList.Mvc在EF中的使用方法

5222发表于2015-06-09

之前的文章有提到mvc的分页组件PagedList.Mvc,今天就来介绍一下利用这个PagedList.Mvc来快速的实现分页数据展示。为了简单,这里就用,MVC5与EF6 Code First 第一个入门完整实例教程,项目基础上加上EF数据的分页展示的功能。

1、先为Products表多添加几条数据

在原来Products表中多添加点数据,如下图:

2、使用nuget安装PagedList.Mvc

在NuGet中搜索PagedList,出来下面的结果:

点击安装PagedList.Mvc,这个包依赖于PagedList,安装PagedList.Mvc时会自动安装PagedList。

3、在Controller调用PagedList.Mvc,EF返回分页数据

/Controllers/ProductController.cs:

using MiniProfilerDemo.DAL;
using System.linq;
using System.Web.Mvc;
using StackExchange.Profiling;
using System.Collections.Generic;
using MiniProfilerDemo.Models;
using PagedList;

namespace MiniProfilerDemo.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Index(int page=1)
        {
            IPagedList<Product> onePageOfProducts = null;

            using (EFDbContext db = new EFDbContext())
            {
                var profiler = MiniProfiler.Current;
                using (profiler.Step("获取Product列表"))
                {
                    var products = db.Products.OrderBy(m => m.ID);
                    onePageOfProducts = products.ToPagedList(page, 4);
                }
            }
            return View(onePageOfProducts);
        }
    }
}

注意:分页一定要指定一个排序字段,如:db.Products.OrderBy(m => m.ID),不然调用products.ToPagedList(page, 4)要报错。

3、在View视图中展示数据

/Views/Products/Index.cshtml:

@using PagedList.Mvc;
@using PagedList;
@model IPagedList<MiniProfilerDemo.Models.Product>
@{
    ViewBag.Title = "ProductList";
}

<h2>ProductList</h2>
<table class="table">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Price</th>
            <th>Quantity</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.ID</td>
                <td>@item.Name</td>
                <td>@item.Price</td>
                <td>@item.Quantity</td>
            </tr>
        }
    </tbody>
</table>
@Html.PagedListPager(Model, page => Url.Action("Index", new { page }))

注意:视图一定要导入PagedList.Mvc和PagedList两个命名空间,且这个视图泛型集合IPagedList的强类型视图,MVC的强类型视图安全、性能好。

导入命名空间:

@using PagedList.Mvc;
@using PagedList;


指定Model类型:

@model IPagedList<MiniProfilerDemo.Models.Product>

4、查看运行结果

运行页面会下面的结果:

点击页面最左上角的数字,可以看到这个分页底层运行的真实sql语句:

上面的sql语句是通过MiniProfiler.EF工具来监测的,具体用法可以参考:MVC教程--MiniProfiler.EF6监控调试MVC5和EF6的性能

从上面的截图可以看出分页确实是只从数据库里取了4条记录,也就是正好我们设置的每页显示多少条的那么多“products.ToPagedList(page, 4)”,而不是全部返回再在内存里面分页,所以这个PagedList.Mvc性能还是可以的。

小编蓝狐