2011-01-11 103 views
-1

我试图放在一起使用ASP.NET MVC的一个非常简单的应用程序,显示新闻文章和分页他们。我有一些中途,但需要一些帮助,整理分页,并使其与搜索查询一起工作。(家庭作业)MVC分页帮助

这里是我的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); 
} 

的想法是,控制器显示4项每页会按日期排序。这里是我对索引方法的看法:

<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我希望能够页面结果,此刻他们迷路了:/

谢谢。

+0

刚刚回答了类似的问题:http://stackoverflow.com/questions/4659978/asp-net-mvc-pagination-using-take-and-skip/4662573#4662573 – Omu 2011-01-11 21:25:57

+0

任何更新谢谢你。 – Cameron 2011-01-11 22:01:32

回答

2

你没有提到你在做什么实际的错误,但我想我看到了什么问题:

这两条线将返回你的一个IEnumerable包含您的结果。

var paginatedArticles = OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize).ToList(); 

return View(paginatedArticles); 

然而,根据你的看法和您发布的辅助类,你视图期待PaginatedList对象作为它的模型。

如果是这样的话,我会做以下(更新):

var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize); 

return View(paginatedArticles); 

然后您认为应该返回到它合适的型号。这说:我不知道你为什么不使用存储库层,但除非你的应用程序只是一个页面,否则几乎总是一个好主意。

更新 --here就是我认为的完全控制逻辑应该是:

public ActionResult Index(String query, int? page) 
{ 
    const int pageSize = 4; 

    var ArticleQuery = from m in _db.ArticleSet select m; 

    // Searching 
    if (!string.IsNullOrEmpty(query)) 
    { 
     ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query)); 
    } 

    var OrderedArticles = ArticleQuery.OrderByDescending(m => m.posted); 

    var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize); 
    // this will now be of type paginatedList. this class handles all of the paging for you, so no need to do that ahead of time 

    return View(paginatedArticles); 
} 

在这种情况下,PaginatedList不是一个帮手--its一个完整的对需要创建和传递类到你的模型。严格定义这个词的助手是完全不同的,可能在你的情况下不适用。