読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ASP.NET MVCでページャーつきテーブルを表示する

ASP.NET C#

WebGrid使えば何も考えなくてもしてくれるのですが、何も考えない方法だと1000件のデータを50件ずつ表示する場合でも、いったん1000件とってこないといけなくて、とっても非効率的。ページに表示する必要最低限のデータだけ用意したいというんじょが世の中の常ですよね。

ページに渡すデータの作成

Controllerで適当に作りました。

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        private static readonly int MaxCount = 100;
        private static readonly int PageSize = 10;

        // 引数にpageという名前のパラメータを受け取るようにする。
        // WebGridのページ切り替えのリンクで押されたページ番号がくるっぽい
        public ActionResult Index(int page = 1)
        {
            var current = page * PageSize;
            if (current > MaxCount)
            {
                // ふつうはそれなりなページ返すほうがいいかな
                throw new HttpException(400, "ページ範囲外です");
            }

            // 必要なデータだけつめてページに引き渡す
            return View(new PagerViewModel
            {
                People = Enumerable
                    .Range(current, PageSize)
                    .Select(i => new Person { Name = "tanaka" + i, Age = i % 30 }),
                MaxCount = MaxCount,
                PageSize = PageSize,
                CurrentPage = page
            });
        }

    }

    public class PagerViewModel
    {
        public IEnumerable<Person> People { get; set; }
        public int MaxCount { get; set; }
        public int CurrentPage { get; set; }
        public int PageSize { get; set; }
    }

    public class Person
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }
}

WebGridでページ切り替えつきでデータを表示

WebGridのコンストラクタに表示したいデータを渡すのが一番簡単な方法ですが、今回は簡単な方法でよきにはからってくれることが邪魔なのでBindメソッドを使います。Bindメソッドを使うと、自動でページングとかをOffにできます。あとは、Controllerで設定した全体の行数とかを設定すればOK.

@{
    ViewBag.Title = "Home Page";
}
@model WebApplication1.Controllers.PagerViewModel
@{
    // WebGridを作って
    var grid = new WebGrid();
    // Bindでいろいろ指定する
    grid.Bind(
        // 表示するデータ
        source: this.Model.People,
        // 表示する列
        columnNames: new[] { "Name", "Age" },
        // 自動でやってくれるページングやソートを切る
        autoSortAndPage: false,
        // 全体の行数を設定する
        rowCount: this.Model.MaxCount);
}

<div class="jumbotron">
    <h1>ASP.NET</h1>
    <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>
    <p><a href="http://asp.net" class="btn btn-primary btn-large">Learn more &raquo;</a></p>
</div>

<div class="row">
    <div class="col-lg-12">
        @* formでくくらないとpageのパラメータが飛んでいかない *@
        @using (Html.BeginForm())
        {
            <div>
                @(this.Model.CurrentPage)Page.
            </div>
            @* あとは普通通りGetHtml *@
            @grid.GetHtml()
        }
    </div>
</div>

これで、ページ切り替えしつつ、データは必要最低限しかとらないページの完成です。