2011-01-11 63 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一個完整的對需要創建和傳遞類到你的模型。嚴格定義這個詞的助手是完全不同的,可能在你的情況下不適用。