ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

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行は以下のようなイメージで表示される。 f:id:haronoid:20180704191028p:plain

ページ番号をクリックするとIndexにpageが設定された形で次のページが呼び出される。

考えるところ…

EntityFrameworkをそのまま表示する場合、内部的に必要な部分だけ読み込んでくれるかもしれないが、 直接SQLを投げたりする場合は、このまますべて任せると全件読み取りになるため、パフォーマンス的には良くない。

ページング用のデータと、表示用のデータを別に実装したほうが良いかも

EntityFrameworkと連携する場合、もっと効率は良さそう

PagedList.IPagedList<App.ViewModel.MyModel> list;
list = ef.users.ToPagedList(pageNo, pageSize);