ASP.NET MVC ページングを実装
ASP.NET MVC上でページングを実装する。
Nuget
以下のパッケージを追加 * PagedList.Mvc
Controller
簡単にリストモデルをPagedListで返す様にするだけ、 * pageパラメータから、ページ番号を取得する。(最初は1) * returnのViewにToPagedList(ページ番号, 表示行数)を返す。
using PagedList; public class HomeController { public ActionResult Index(string page) { int pageNo = int.Parse(page ?? "1"); List<MyModel> model = GetModelList(); return View(model.ç); } }
ViewModel
public class MyModel { public string Name {get;set;} public string Address {get;set;} }
HTML
View側のモデルをPagedListに設定する
Index.cshtml
@model PagedList.IPagedList<App.ViewModel.MyModel> @using PagedList.Mvc; <link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> <table class="table"> <tr> <th>Name</th> <th>Address</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Address) </td> </tr> } </table> <br/> Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { page }))
最後の2行は以下のようなイメージで表示される。
ページ番号をクリックするとIndexにpageが設定された形で次のページが呼び出される。
考えるところ…
EntityFrameworkをそのまま表示する場合、内部的に必要な部分だけ読み込んでくれるかもしれないが、 直接SQLを投げたりする場合は、このまますべて任せると全件読み取りになるため、パフォーマンス的には良くない。
ページング用のデータと、表示用のデータを別に実装したほうが良いかも
EntityFrameworkと連携する場合、もっと効率は良さそう
PagedList.IPagedList<App.ViewModel.MyModel> list; list = ef.users.ToPagedList(pageNo, pageSize);