既存の回答は dataTable の古いバージョンに適用される可能性がありpageNo * pageSize
ますが、現在のバージョン (私は 1.10 以降を使用しています) は開始レコードと長さを渡すため、示唆するものはすべて間違った結果をもたらします。
最初の単純な「手動」アプローチ
受け入れられた答えも、私がやりたいことに対して非常に複雑でした。デバッグの後、ページサイズと開始レコードがおよびRequest
という名前の Http 値として単純に渡されることがわかりました。テキスト検索は次のように渡されます。並べ替え順序は名前付きのメンバーで渡され、並べ替え方向はetcで渡されます。start
length
search[value]
order[0][column]
order[0][dir]
並べ替えとフィルター処理に使用した基本的なコードは次のようになります。
HTTP Request オブジェクトからページング、ソート、およびフィルタリングの値を取得します。
int startRec = 0;
int.TryParse(Request["start"], out startRec);
int pageSize = 10;
int.TryParse(Request["length"], out pageSize);
var search = Request["search[value]"];
var order = Request["order[0][column]"];
var direction = Request["order[0][dir]"];
var query = this._dataStore.Records.AsQueryable();
最初に (大文字と小文字を区別しない) 検索を適用します。
if (!string.IsNullOrWhiteSpace(search))
{
query = query.Where(x => x.Label.ToLower().Contains(search.ToLower()));
}
次に、並べ替えを適用します。
switch (order)
{
// My id column
case "0":
query = (direction == "desc") ? query.OrderByDescending(x => x.Id) : query.OrderBy(x => x.Id);
break;
// My label column
case "1":
query = (direction == "desc") ? query.OrderByDescending(x => x.Label) : query.OrderBy(x => x.Label);
break;
}
最後にページングを適用します。
query = query.Skip(startRec).Take(pageSize);
正しいレコードを返す準備が整いました。
更新 (「Datatables.net for MVC5」を使用)
サーバー側の dataTables の基本を理解したら、このコードを単純化する既存のプラグイン/ユーティリティを探し始めました。これまでに見つけた MVC 5 の最も適切なものは、MVC5 nuget パッケージの Datatables.net です。
NuGet パッケージをインストールする
DataTablesBinder
IDataTablesRequest インターフェイスを提供するためにコントローラー アクションを使用するように変更します。
例えば
public JsonResult Table([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestmodel)
- 最初に検索フィルターを適用します。
例えば
if (!string.IsNullOrEmpty(requestmodel.Search.Value))
{
query = query.Where(x => x.CompanyTypeName.Contains(requestmodel.Search.Value) || x.CompanyTypeDescription.Contains(requestmodel.Search.Value));
}
- 任意の並べ替えを適用します。
例えば
foreach (var sort in requestmodel.Columns.GetSortedColumns())
{
switch (sort.Name)
{
case "CompanyTypeDescription":
query = sort.SortDirection == Column.OrderDirection.Ascendant ? query.OrderBy(x => x.CompanyTypeDescription) : query.OrderByDescending(x => x.CompanyTypeDescription);
break;
case "CompanyTypeName":
default:
query = sort.SortDirection == Column.OrderDirection.Ascendant ? query.OrderBy(x => x.CompanyTypeName) : query.OrderByDescending(x => x.CompanyTypeName);
break;
}
}
- 次に、前
Skip
と同じように とを使用してページングを適用します。Take
例えば
var result = query.Skip(requestmodel.Start).Take(requestmodel.Length).Select(x => new { x.CompanyTypeName, x.CompanyTypeDescription });
- 最後に、
DataTablesResponse
オブジェクトを使用して JSON の結果を返します。
例えば
return Json(new DataTablesResponse(requestmodel.Draw, result, query.Count(), base.RefSureContext.CompanyType.Count()), JsonRequestBehavior.AllowGet);
これにより、すべての検索、並べ替え、およびページングが単純化され、簡単に繰り返すことができるパターンになりました。
アドインのドキュメントはこちらです。