首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >博客系统的分页实现

博客系统的分页实现
EN

Code Review用户
提问于 2015-05-22 13:37:30
回答 1查看 3K关注 0票数 5

昨天晚上,我正在做一个项目,作为一个学习的练习。我决定在我的博客系统中添加分页功能。我做了个尝试然后接近了..。但我决定撤销我的改变,我在网上搜索其他“更好”的解决方案。我找到了这个例子,它使用PagedList.Mvc、NuGet和这个例子,它们来自使用相同包的asp.net。

长话短说,我决定在安装另一个软件包之前,我会再尝试一次我自己的实现,我成功了.关于我的问题。

,我在实现过程中错过了一些重要的东西,应该让我重新考虑我的方法吗?

以下是我在HomeController.cs中的相关操作:

代码语言:javascript
复制
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的相关代码:

代码语言:javascript
复制
<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>

注意:我知道需要更多的逻辑,这样才能在页面被分割后对其余的页面进行解释。但到目前为止这还不是我最大的担忧。

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-05-22 14:08:13

代码语言:javascript
复制
int num

num到底代表什么?页数?每页的发帖数?当前页码?正确地命名变量在这里将有很大帮助。

代码语言:javascript
复制
var postsPerPage = 3;

将其转换为一个默认值3的参数。这样,您以后总是可以决定用户可以不费吹灰之力地更改它。

与其使用基于0的页面,然后将1添加到演示文稿中,我会考虑使用相反的方法:基于1的页面,并在确定要显示的页面时减去1。本质上,这将使您的循环从i = 2转向,name变得不必要,而在您的控制器中则使用int skip = (num - 1) * postsPerPage

代码语言:javascript
复制
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页的!

我认为,也许您应该使用两个查询:

代码语言:javascript
复制
var totalPosts = uwork.PostRepository.GetAll().Count() 

它将在数据库端执行一个select count(*) from posts,并执行另一个为您提供页面的查询:

代码语言:javascript
复制
var pages = uwork.PostRepository.GetAll().Skip(skip).Take(postsPerPage)

另一种牢记性能的方法是使用

代码语言:javascript
复制
uwork.PostRepository.GetAll().Take(postsPerPage * 10).ToArray();

你会给我这个吗

  1. 职位数量(确切数量为pages.Length)
  2. 混凝土柱(即pages.Skip(skip).Take(postsPerPage))

这样做的好处是,它只调用数据库一次(网络延迟是您的恶魔之一),缺点是它检索的项目比您感兴趣的多。

我不会循环到ViewBag.pages + 1,可能会在i >= 10上爆发,我只会循环到Math.Min(ViewBag.Pages + 1, 10)

票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/91490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档