私は MVC4 アプリで jQuery データテーブル ( http://www.datatables.net ) を使用しています。ご存じのとおり、このテーブルではサーバー側の処理が可能です。複数のコントローラーに関連付けられた複数のビューでテーブルを使用するので、コントローラーごとにメソッドを記述する必要なく、データをファイラー、ソート、ページングするための一般的な方法を実装したいと思います。私がそうすると、それらはすべて同じように見えますが、データベースとは異なるエンティティを対象とし、異なる列でテキストのフィルタリングと並べ替えを行うことになります。ここで私が今日しなければならないこと:
public virtual ActionResult AjaxHandler(jQueryDataTableParamModel param)
{
var myProducts = _productRepository.Products;
IEnumerable<Product> filteredProducts = myProducts;
// Filtering
if (!string.IsNullOrEmpty(param.sSearch))
{
var searchTermLower = param.sSearch.Trim().ToLower();
filteredProducts = filteredProducts
.Where(c => c.Title.Contains(param.sSearch)
||
c.Manufacturer.ManufacturerName.ToLower().Contains(searchTermLower)
||
c.Category.CategoryTitle.ToLower().Contains(searchTermLower)
||
c.Size.Title.ToLower().Contains(searchTermLower)
||
c.Price.ToString("C").Contains(searchTermLower));
}
// Sorting
var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
var sortDirection = Request["sSortDir_0"];
if (sortColumnIndex == 0)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.CreatedDate) : filteredProducts.OrderByDescending(x => x.CreatedDate);
}
else if (sortColumnIndex == 1)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Title) : filteredProducts.OrderByDescending(x => x.Title);
}
else if (sortColumnIndex == 2)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Manufacturer.ManufacturerName) : filteredProducts.OrderByDescending(x => x.Manufacturer.ManufacturerName);
}
else if (sortColumnIndex == 3)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Size.Title) : filteredProducts.OrderByDescending(x => x.Size.Title);
}
else if (sortColumnIndex == 4)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Category.CategoryTitle) : filteredProducts.OrderByDescending(x => x.Category.CategoryTitle);
}
else if (sortColumnIndex == 4)
{
filteredProducts = sortDirection == "asc" ? filteredProducts.OrderBy(x => x.Price) : filteredProducts.OrderByDescending(x => x.Price);
}
// Paging
var displayedProducts = filteredProducts.Skip(param.iDisplayStart).Take(param.iDisplayLength);
var result = from c in displayedProducts
select new[] { c.ProductId.ToString(CultureInfo.InvariantCulture), c.CreatedDate.ToString("G"), c.Title, c.Manufacturer.ManufacturerName, c.Size.Title, c.Category.CategoryTitle, c.Price.ToString("C") };
return Json(new
{
sEcho = param.sEcho,
iTotalRecords = myProducts.Count(),
iTotalDisplayRecords = filteredProducts.Count(),
aaData = result
}, JsonRequestBehavior.AllowGet);
}
この一般的なものを作成するためにいくつかのことを試みましたが、どれも完全には機能しませんでした.一部は、すべての列をフィルタリングしたためであり、他の理由は他の理由でした. これを行うためのより良い方法があることを望んでいるので、代わりに列を選択する列または関数を渡して機能させることができます。