【发布时间】:2012-06-21 11:45:46
【问题描述】:
我有一个 ASP.NET MVC 4 项目和一个 SQL 视图 (vvItem)。 物品控制器
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 中,我有将近 400000 条记录。我认为 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 秒
-
对于问题 2,它将在控制器中进行管理,如 NerdDinner 示例和下面发布的 user1439338 所示。您的视图必须计算页面数量并管理页面链接。如 NerdDinner 链接底部所示,专用视图模型是一种好方法。
标签: asp.net-mvc pagination webgrid skip-take