2011-01-12 24 views
-1

我試圖把一個非常簡單的應用程序使用ASP.NET MVC顯示新聞文章和分頁他們。我有一些中途,但需要一些幫助,整理分頁,並使其與搜索查詢一起工作。這不是這個問題的重複(Homework) MVC Pagination Help,因爲它處理在使用分頁時保持搜索查詢並被推薦開始一個新問題。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我希望能夠在結果丟失的時刻對結果進行分頁。我假設我將需要諸如/?query = test & page = 1

謝謝。

+1

你不需要添加(家庭作業)的標題 - 沒有任何用途。最好添加一個標籤。你被低估的原因可能是因爲你有三個幾乎相同的問題。要麼縮小你的問題範圍,要麼更加努力地做自己的研究。 – 2011-01-12 02:57:59

+0

我被告知要創建一個新問題,否則如果我必須繼續編輯原始問題並發表評論,則問題會被扭曲。 – Cameron 2011-01-12 03:28:56

回答

1

你提出的查詢字符串應該工作(直接在瀏覽器中試一下以確保)。

如果有人點擊導航鏈接,您將遇到問題,因爲您的Html.ActionLink調用中未計入query參數。由於這是功課,我會把它作爲練習讀者= 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 */ })%> 

我不知道你如何重新設置您的路由,但類似的東西應該工作。你也可以緩存對象,甚至只是字符串查詢本身,但這是一個完整的其他抽象層。