我有一個ASP.NET MVC 4項目和一個SQL視圖(vvItem)。 ItemControllerASP.NET MVC Webgrid高效分頁
MVCAppEntities db = new MVCAppEntities();
public ActionResult Index()
{
var itemqry = db.vvItem.OrderBy(s => s.name);
//var pageditems = itemqry.Skip(10).Take(20); // 25 seconds
return View(itemqry.ToList()); // 88 seconds
}
Index.cshtml查看
@model IEnumerable<MVCApplication1.Models.vvItem>
@{
var norows = 20;
var grid = new WebGrid(Model, canPage: true, rowsPerPage: norows);
grid.Pager(WebGridPagerModes.NextPrevious);
@grid.GetHtml(tableStyle: "table", headerStyle: "header", columns: grid.Columns(
grid.Column(columnName: "name", header: "Name", canSort: true),
grid.Column(columnName: "quantity", header: "Quantity", canSort: true),
grid.Column(columnName: "code", header: "Code", canSort: true),
grid.Column(columnName: "Price", header: "Price", canSort: true),
))}
在vvItem我幾乎40萬的記錄。我認爲webgrid Pager將只加載(Take())顯示的記錄,並且如果我將進入下一頁,它將知道Skip()第一個記錄。
問題:我如何有效地使視圖只加載顯示的記錄?
我發現2個解決方案:JSON version和NerdDinner
我不太擅長JSON,所以我試過的NerdDinner解決方案。正如在我的註釋行 //var pageditems = itemqry.Skip(10).Take(20);
itemqry已經加載了所有的記錄,並且它花了很多時間來加載。
Q2:現在該如何做分頁?我需要修改頁面號。從Index方法。
public ActionResult Index(int? page, string filter1 = " ", string filter2 = " ")
在NerdDinner範例例如他們會兌現的X視圖不itemqry。 –
我將x重命名爲pageditems。正如您在Skip-Take中看到的那樣,花了25秒而沒有88秒 – Misi
對於問題2,它將在控制器中進行管理,如NerdDinner示例中所示,並在user1439338下面發佈。您的觀點必須計算頁數並管理頁面鏈接。在NerdDinner鏈接底部顯示的專用視圖模型是一種好方法。 – Turnkey