ASP.NET WebPagesと相性のよい jQuery DataTables

ASP.NET WebPages (MVCではない)で、Razor(cshtml)で書くのがマイブームです。ASPXより圧倒的に書きやすく、MVCほどコードの分散が起こらず、一人でコードを書くには最適な選択だと感じています。

さて、cshtml上で、サーバーサイドのデータでもって、ページング、ソート、フィルター付きのテーブルを探していた時に jQuery DataTables にたどり着きました。ほかにも類似のTableソリューションはたくさんありますが、これが、軽量、簡単で ASP.NET Web Pagesと非常に相性がいいと思ったので紹介します。

「DataTables https://datatables.net/index はjQueryのプラグインライブラリで、HTMLのtableに機能を追加する形で動作します。」

詳細は原典を参照してもらうことにし、ASP.NET Web Pages から使用する場合のキーポイントに絞ると

  • AJAXによるサーバーサイドからのデータの取り出しに対応。
  • サーバーサイドのページング、ソート、フィルター(検索)に対応している。
  • サーバーへのリクエストは FORMエンコーディングで、サーバー側のパラメータの取り出しに Request.Form が使える。
  • クライアントへの応答は json で、サーバーからは Json(System.Web.Helpers.Json)で簡単に応答できる。
  • 受け渡すデータは型が規定されていない(ただの配列渡し)のでルーズだが、簡単。サーバーサイドでLINQと anonymous object を組み合わせれば非常に簡単。

サンプルとしてシステムにある System.Globalization.CultureInfo を列挙してテーブルに表示するコードを書いてみました。1ページアプリとしてもこんなに簡単に短く、高機能テーブルを書くことができました。

http://www.yo-ki.com/study/ASPNET/ExperimentDataTables

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@{
    if( IsPost ){
        if( UrlData[0] == "GetList" ){
            String sEcho = Request.Form["sEcho"];
            int iDisplayStart = Request.Form["iDisplayStart"].AsInt(),
                iDisplayLength = Request.Form["iDisplayLength"].AsInt(),
                iSortingCols = Request.Form["iSortingCols"].AsInt();
            String sSearch = Request.Form["sSearch"];
            var data = new List<object>();
            var all = System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures);
            var filtered = all.AsEnumerable<System.Globalization.CultureInfo>();
            if( !String.IsNullOrEmpty(sSearch) ){
                filtered = filtered.Where(p => p.DisplayName.Contains(sSearch) || p.Name.Contains(sSearch) || p.ThreeLetterISOLanguageName.Contains(sSearch) || p.TwoLetterISOLanguageName.Contains(sSearch));
            }
            for( var i=0; i<iSortingCols; i++ ){
                var iSort = Request.Form["iSortCol_" + i].AsInt(-1);
                var ascending = Request.Form["sSortDir_" + i];
                if( ascending == "asc" ){
                    filtered = filtered.OrderBy(p => iSort == 0 ? p.Name : iSort == 1 ? p.DisplayName : iSort == 2 ? p.TwoLetterISOLanguageName : p.ThreeLetterISOLanguageName);
                }
                else
                {
                    filtered = filtered.OrderByDescending(p => iSort == 0 ? p.Name : iSort == 1 ? p.DisplayName : iSort == 2 ? p.TwoLetterISOLanguageName : p.ThreeLetterISOLanguageName);
                }
            }
            var result = filtered;
            foreach( var ci in filtered.Skip(iDisplayStart).Take(iDisplayLength) ){
                var row = new List<object>();
                row.Add(ci.Name);
                row.Add(ci.DisplayName);
                row.Add(ci.TwoLetterISOLanguageName);
                row.Add(ci.ThreeLetterISOLanguageName);
                data.Add(row);
            }
            Response.Clear();
            Response.ContentType = "text/json";
            Response.Write( Json.Encode(new {
                sEcho = sEcho,
                iTotalRecords = all.Count(),
                iTotalDisplayRecords = filtered.Count(),
                aaData = data
            }));
            Response.End();
            return;
        }
    }
}
<script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.js"></script>

<link rel="stylesheet" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css" type="text/css"/>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.js"></script>

<script>
    $(document).ready(function () {
        $("#sampleTable").dataTable({
            "bProcessing": true,
            "bServerSide": true,
            "bPaginate": true,
            "sPaginationType": "full_numbers",
            "sServerMethod": "POST",
            "sAjaxSource": '@(Request.Path)/GetList'
        });
    });
</script>
<div>
    <table id="sampleTable">
        <thead>
            <tr><th>Name</th><th>DisplayName</th><th>TwoLetterISOLanguageName</th><th>ThreeLetterISOLanguageName</th></tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>
Comments are closed