MVC分页帮助查询字符串

时间:2011-01-12 00:00:59

标签: asp.net-mvc pagination

我正在尝试使用ASP.NET MVC组合一个非常简单的应用程序,它显示新闻文章并对它们进行分页。我有点中途,但需要一些帮助来整理分页并让它与搜索查询一起工作。这不是此问题(Homework) MVC Pagination Help的重复,因为它涉及在使用分页时保留搜索查询,并建议开始一个新问题。

这是我的HomeController:

public ActionResult Index(String query, int? page)
{
        // limit the number of articles per page
        const int pageSize = 4;
        // build the query
        var ArticleQuery = from a in _db.ArticleSet select a;
        // check if their is a query
        if (!string.IsNullOrEmpty(query))
        {
            ArticleQuery = ArticleQuery.Where(a => a.headline.Contains(query));
        }
        // orders the articles
        var OrderedArticles = ArticleQuery.OrderByDescending(a => a.posted);
        // takes the ordered articles and paginates them
        //var paginatedArticles = new PaginatedList(OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize), page ?? 0, pageSize);
        var paginatedArticles = new PaginatedList<Article>(OrderedArticles, page ?? 0, pageSize);
        // return the paginated articles to the view
        return View(paginatedArticles);
}

这个想法是Controller每页显示4个项目将按日期排序。以下是我对Index方法的看法:

<ul id="pagination">
    <% if (Model.PreviousPage) { %>
        <li><%= Html.ActionLink("<< First Page", "Index")%></li>
        <li><%= Html.ActionLink("<< Previous Page", "Index", new { page=(Model.PageIndex-1) }) %></li>
    <% } %>
    <% if (Model.NextPage) { %>
        <li><%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%></li>
        <li><%= Html.ActionLink("Last Page >>", "Index", new { page = (Model.TotalPages - 1) })%></li>
    <% } %>    
</ul>

这个想法是这两个分页链接只会显示条件是否为真。

最后,这是寻呼机的PaginatedList类:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace NewsApp.Models
{
    public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; private set; }
        public int PageSize { get; private set; }
        public int TotalCount { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            PageSize = pageSize;
            TotalCount = source.Count();
            TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

            this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize));
        }
        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 0);
            }
        }
        public bool HasNextPage
        {
            get
            {
                return (PageIndex + 1 < TotalPages);
            }
        }
    }

注意:我不想使用像MVCContrib等任何第三方组件,因为这是针对大学的任务,所以会破坏目的。

现在分页工作正常,但是当我进行搜索时,例如/?query = test我希望能够在结果丢失的同时分页。我假设我需要像/?query = test&amp; page = 1

这样的东西

感谢。

1 个答案:

答案 0 :(得分:1)

您提供的查询字符串应该可以使用(直接在浏览器中尝试以确保)。

当您有人点击导航链接时,您会遇到问题,因为query来电中未考虑Html.ActionLink参数。由于这是家庭作业,我将把它作为读者的练习= p

老实说,但是。你应该能够从那里弄明白。如果没有评论,我会再次插话。

-cheers

<强>更新

以下是您目前拥有下一个链接的内容:

<%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%>

您需要做的是将查询作为另一个参数添加到ActionLink。但是,在执行此操作之前,您需要在模型中的某处捕获查询字符串。执行此操作的脏方法是将查询值添加到ViewData并以此方式传递;干净的方法是在paginatedList类中添加一个变量来保存当前查询并在模型中设置它。即

ViewData["query"] = query;

或者如果您选择模型路线:

paginatedList.Query = query;

然后你可以做类似以下的事情:

<%= Html.ActionLink("Next Page >>", "Index", new { Page = (Model.PageIndex + 1), query = ViewData["query"] /*or Model.Query */  })%>

我不确定你是如何重新设置路由的,但是类似于上面的内容应该有效。您也可以缓存IQueryable对象,甚至只是字符串查询本身,但这是另一个抽象层。