asp mvc中如何正确实现分页?事情如下。有一个对象显示在页面上
public class Main
{
string Akt_Name { get; set; }
[Key]
public string Reg_Num { get; set; }
}
通过在数据库中搜索,我得到了这些对象的列表。那我用PagedList.MVC
List<Main> lst = new List<Main>(); - объявляю как глобальный.
return PartialView(lst.ToPagedList(pageNumber, pageSize));
演示代码:
@using PagedList.Mvc;
@model PagedList.IPagedList<LocalEtalon_mvc.Models.Main>
@using WebApp.Models;
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
@foreach (Main item in Model)
{
<li>
<span class="S_regnum">@item.Reg_Num</span> <span class="S_aktname">@item.Akt_Name</span>
<br />
<a id="aRegnum_@item.Reg_Num" class="Aktcard" href="#">карта</a> <a id="tRegnum_@item.Reg_Num" class="Akttext" href="#">текст</a>
</li>
}
Страница @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) из @Model.PageCount
@Html.PagedListPager(Model, page => Url.Action("changePage", new { page }))
<script src="~/Scripts/main.js"></script>
一切似乎都有效,但只有在页面被更改之前。lst 设置为零,仅此而已。我究竟做错了什么?lst 的存储选项是什么?难道不需要每次都搜索数据库并返回所找到内容的列表吗?
lst 不能在页面转换后继续存在——MVC 在每个请求上创建一个控制器类的新实例。而且,在实际部署应用时,通常会使用几台服务器,第二页的请求可以到达另一台物理服务器。
每次都应该从数据库中重新选择数据。还希望同时调用
ToPagedList
原始IQueryable
对象,而不是调用内存中选定的整个对象列表 - 这样只会从数据库中加载特定页面。有 lst 存储选项
HttpContext.Cache
,所有用户共有 + 您应该提前决定如何在列表更改时使其无效。但在小型应用中,从数据库中重新选择数据还是比较容易的。