昨天晚上,我正在做一个项目,作为一个学习的练习。我决定在我的博客系统中添加分页功能。我做了个尝试然后接近了..。但我决定撤销我的改变,我在网上搜索其他“更好”的解决方案。我找到了这个例子,它使用PagedList.Mvc、NuGet和这个例子,它们来自使用相同包的asp.net。
长话短说,我决定在安装另一个软件包之前,我会再尝试一次我自己的实现,我成功了.关于我的问题。
以下是我在HomeController.cs中的相关操作:
public ActionResult Index(int num = 0)
{
var postsPerPage = 3;
ViewBag.startNum = num;
using (UnitOfWork uwork = new UnitOfWork())
{
IEnumerable<Post> posts = uwork.PostRepository.GetAll().ToList();
int totalPosts = posts.Count();
ViewBag.pages = totalPosts / postsPerPage;
int skip = num * postsPerPage;
return View(posts.Skip(skip).Take(postsPerPage));
}
}这是我的Index.cshtml的相关代码:
<ul class="pagination">
<li>@Html.ActionLink("Home", "Index", "Home", new { num = 0 }, null)</li>
@for (var i = 1; i < ViewBag.pages + 1; i++)
{
var cur = i.ToString();
var name = i + 1;
<li>@Html.ActionLink(name.ToString(), "Index", "Home", new { num = cur }, null)</li>
if (i >= 10) { break; }
}
</ul>
注意:我知道需要更多的逻辑,这样才能在页面被分割后对其余的页面进行解释。但到目前为止这还不是我最大的担忧。
发布于 2015-05-22 14:08:13
int numnum到底代表什么?页数?每页的发帖数?当前页码?正确地命名变量在这里将有很大帮助。
var postsPerPage = 3;将其转换为一个默认值3的参数。这样,您以后总是可以决定用户可以不费吹灰之力地更改它。
与其使用基于0的页面,然后将1添加到演示文稿中,我会考虑使用相反的方法:基于1的页面,并在确定要显示的页面时减去1。本质上,这将使您的循环从i = 2转向,name变得不必要,而在您的控制器中则使用int skip = (num - 1) * postsPerPage。
using (UnitOfWork uwork = new UnitOfWork())
{
IEnumerable<Post> posts = uwork.PostRepository.GetAll().ToList();
int totalPosts = posts.Count();
ViewBag.pages = totalPosts / postsPerPage;
int skip = num * postsPerPage;
return View(posts.Skip(skip).Take(postsPerPage));
}ViewBag.pages (注意不正确的命名约定)向我指示一个页面集合。但是,在您的情况下,更合适的名称是AmountOfPages。
我觉得这里有优化的空间:如果你有100.000页呢?甚至只有100?每次有人访问首页时,您将加载所有项目,您这样做只是为了向用户显示项目有多少页。事实上,你甚至没有这样做:无论如何,你不会给他们看超过10页的!
我认为,也许您应该使用两个查询:
var totalPosts = uwork.PostRepository.GetAll().Count() 它将在数据库端执行一个select count(*) from posts,并执行另一个为您提供页面的查询:
var pages = uwork.PostRepository.GetAll().Skip(skip).Take(postsPerPage)另一种牢记性能的方法是使用
uwork.PostRepository.GetAll().Take(postsPerPage * 10).ToArray();你会给我这个吗
pages.Length)pages.Skip(skip).Take(postsPerPage))这样做的好处是,它只调用数据库一次(网络延迟是您的恶魔之一),缺点是它检索的项目比您感兴趣的多。
我不会循环到ViewBag.pages + 1,可能会在i >= 10上爆发,我只会循环到Math.Min(ViewBag.Pages + 1, 10)。
https://codereview.stackexchange.com/questions/91490
复制相似问题