MVC .NET Framework 中的分页不起作用,如何让它工作
Paging in MVC .NET Framework not working, how to get it to work
我尝试使用 Entity Framework 将旧的 asp.net webforms 应用程序转换为 MVC 应用程序。我使用 EF Core 工具中的 scaffold-DbContect 命令为此应用程序生成了模型。我能够生成项目列表。在这种情况下,我正在转换一个旧的问题跟踪器系统。该列表是已注册错误的列表。但这是一个相当长的列表(5K+ 记录),所以我想添加分页。我遇到了 this item on SO,第三个答案看起来对我有用。
所以我将下一个代码添加到我的控制器 index-action
public ActionResult Index(int page = 0)
{
int pageSize = 10;
var qry = db.Bugs
.Include(e => e.Organization)
.Include(e => e.AssignedUser)
.Include(e => e.UpdatedUser)
.Include(e => e.ReportedUser)
.Include(e => e.Project)
.Include(e => e.Category)
.Include(e => e.Status)
.Include(e => e.Priority)
.AsNoTracking()
.AsQueryable();
var count = qry.Count();
var data = qry.Skip(page * pageSize).Take(pageSize).OrderBy(e => e.BgId);
this.ViewBag.MaxPage = (count / pageSize) - (count % pageSize == 0 ? 1 : 0);
this.ViewBag.Page = page;
return View(data.ToList());
}
问题是,我没有得到任何结果。如果我调试数据 var 的计数为 10,但没有输出。
如果我不过滤,只是在我的 return View() 中使用 qry.ToList(),我会得到所有记录。也不抛出异常。我错过了什么?有人有线索吗?我想我忽略了一些东西。
感谢@pcalkins 的帮助,我可以使用 PageList.mvc 助手解决我的问题。
我在 Action 中得到了下一个代码:
// GET: Bugs
public ActionResult Index(int? page)
{
var qry = db.Bugs
.Include(e => e.Organization)
.Include(e => e.AssignedUser)
.Include(e => e.UpdatedUser)
.Include(e => e.ReportedUser)
.Include(e => e.Project)
.Include(e => e.Category)
.Include(e => e.Status)
.Include(e => e.Priority)
.OrderBy(e => e.BgId).ToList();
int pageSize = 20;
int pageNumber = page ?? 1;
return View(qry.ToPagedList(pageNumber, pageSize));
}
我不得不更改视图以使其与此 PageList 助手一起工作:
@model PagedList.IPagedList<IssueTracker.Models.Bugs>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Issuelist";
}
<div class="container pt-5">
<div class="pb-2">
<form action="" class="form-inline">
@Html.ActionLink("Add", "Create", "Bugs", null, new { @class = "btn btn-success mr-sm-2" })
<div class="form-group mr-sm-2">
<select class="custom-select">
<option selected="">Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</div>
<button type="button" class="btn btn-primary mr-sm-2">
<i class="fa fa-print"></i>
</button>
<button type="button" class="btn btn-primary mr-sm-2">
<i class="fa fa-file-excel-o"></i>
</button>
</form>
</div>
<div class="table-responsive">
<table class="table table-hover tauw-table table-sm" id="tauw-table">
<thead>
<tr>
<th scope="col">
ID
</th>
<th scope="col">
Description
</th>
<th scope="col">
Reported by
</th>
<th scope="col" style="width:120px">
Reported on
</th>
<th scope="col">
Status
</th>
<th scope="col">
Priority
</th>
<th scope="col">
Organisation
</th>
<th scope="col">
Category
</th>
<th scope="col">
Project
</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<th scope="row">
@Html.DisplayFor(modelItem => item.BgId)
</th>
<td>
@Html.DisplayFor(modelItem => item.BgShortDesc)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReportedUser.UsUsername)
</td>
<td>
@Html.DisplayFor(modelItem => item.BgReportedDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Status.StName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Priority.PrName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Organization.OgName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Category.CtName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Project.PjName)
</td>
<td style="width:50px;">
<a href="@Url.Action("Edit", "Bugs",new { id = item.BgId })" class="fa fa-edit"></a>
<a href="@Url.Action("Delete", "Bugs",new { id = item.BgId })" class="fa fa-trash"></a>
</td>
</tr>
}
</tbody>
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>
我无法立即让它工作。它有时只显示一条记录有时显示4条,非常难以预测。当我尝试调试时,我看到一个错误,如:“已经有一个打开的 DataReader 与此连接关联,必须先关闭它。”当我搜索答案时,我遇到了 this 网站,该网站建议使用 ToList() 函数和 include() 选项。这解决了我的寻呼问题。希望这也能帮助到其他人。
我尝试使用 Entity Framework 将旧的 asp.net webforms 应用程序转换为 MVC 应用程序。我使用 EF Core 工具中的 scaffold-DbContect 命令为此应用程序生成了模型。我能够生成项目列表。在这种情况下,我正在转换一个旧的问题跟踪器系统。该列表是已注册错误的列表。但这是一个相当长的列表(5K+ 记录),所以我想添加分页。我遇到了 this item on SO,第三个答案看起来对我有用。
所以我将下一个代码添加到我的控制器 index-action
public ActionResult Index(int page = 0)
{
int pageSize = 10;
var qry = db.Bugs
.Include(e => e.Organization)
.Include(e => e.AssignedUser)
.Include(e => e.UpdatedUser)
.Include(e => e.ReportedUser)
.Include(e => e.Project)
.Include(e => e.Category)
.Include(e => e.Status)
.Include(e => e.Priority)
.AsNoTracking()
.AsQueryable();
var count = qry.Count();
var data = qry.Skip(page * pageSize).Take(pageSize).OrderBy(e => e.BgId);
this.ViewBag.MaxPage = (count / pageSize) - (count % pageSize == 0 ? 1 : 0);
this.ViewBag.Page = page;
return View(data.ToList());
}
问题是,我没有得到任何结果。如果我调试数据 var 的计数为 10,但没有输出。 如果我不过滤,只是在我的 return View() 中使用 qry.ToList(),我会得到所有记录。也不抛出异常。我错过了什么?有人有线索吗?我想我忽略了一些东西。
感谢@pcalkins 的帮助,我可以使用 PageList.mvc 助手解决我的问题。
我在 Action 中得到了下一个代码:
// GET: Bugs
public ActionResult Index(int? page)
{
var qry = db.Bugs
.Include(e => e.Organization)
.Include(e => e.AssignedUser)
.Include(e => e.UpdatedUser)
.Include(e => e.ReportedUser)
.Include(e => e.Project)
.Include(e => e.Category)
.Include(e => e.Status)
.Include(e => e.Priority)
.OrderBy(e => e.BgId).ToList();
int pageSize = 20;
int pageNumber = page ?? 1;
return View(qry.ToPagedList(pageNumber, pageSize));
}
我不得不更改视图以使其与此 PageList 助手一起工作:
@model PagedList.IPagedList<IssueTracker.Models.Bugs>
@using PagedList.Mvc;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@{
ViewBag.Title = "Issuelist";
}
<div class="container pt-5">
<div class="pb-2">
<form action="" class="form-inline">
@Html.ActionLink("Add", "Create", "Bugs", null, new { @class = "btn btn-success mr-sm-2" })
<div class="form-group mr-sm-2">
<select class="custom-select">
<option selected="">Open this select menu</option>
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
</select>
</div>
<button type="button" class="btn btn-primary mr-sm-2">
<i class="fa fa-print"></i>
</button>
<button type="button" class="btn btn-primary mr-sm-2">
<i class="fa fa-file-excel-o"></i>
</button>
</form>
</div>
<div class="table-responsive">
<table class="table table-hover tauw-table table-sm" id="tauw-table">
<thead>
<tr>
<th scope="col">
ID
</th>
<th scope="col">
Description
</th>
<th scope="col">
Reported by
</th>
<th scope="col" style="width:120px">
Reported on
</th>
<th scope="col">
Status
</th>
<th scope="col">
Priority
</th>
<th scope="col">
Organisation
</th>
<th scope="col">
Category
</th>
<th scope="col">
Project
</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<th scope="row">
@Html.DisplayFor(modelItem => item.BgId)
</th>
<td>
@Html.DisplayFor(modelItem => item.BgShortDesc)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReportedUser.UsUsername)
</td>
<td>
@Html.DisplayFor(modelItem => item.BgReportedDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Status.StName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Priority.PrName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Organization.OgName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Category.CtName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Project.PjName)
</td>
<td style="width:50px;">
<a href="@Url.Action("Edit", "Bugs",new { id = item.BgId })" class="fa fa-edit"></a>
<a href="@Url.Action("Delete", "Bugs",new { id = item.BgId })" class="fa fa-trash"></a>
</td>
</tr>
}
</tbody>
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("Index",
new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
</div>
我无法立即让它工作。它有时只显示一条记录有时显示4条,非常难以预测。当我尝试调试时,我看到一个错误,如:“已经有一个打开的 DataReader 与此连接关联,必须先关闭它。”当我搜索答案时,我遇到了 this 网站,该网站建议使用 ToList() 函数和 include() 选项。这解决了我的寻呼问题。希望这也能帮助到其他人。