2011-01-12 17 views
-1

私は、ニュース記事を表示し、それらにページを設定するASP.NET MVCを使用して非常に単純なアプリケーションをまとめようとしています。私はそこの半分のところですが、ページネーションを整理して検索クエリを処理するための助けが必要です。これは、この質問(Homework) MVC Pagination Helpの複製ではないので、ページネーションを使用するときに検索クエリを保持することを扱い、新しい質問を開始することが推奨されています。MVCページネーションのクエリ文字列のヘルプ

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つの項目を示していることである:

は、ここに私にHomeControllerです。

<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> 

アイデアは、条件に該当する場合、これらの二つの改ページのリンクのみが表示されるということです。ここで私はIndexメソッドを持っている図です。

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); 
      } 
     } 
    } 

注:最後にここに

は、ページャ用PaginatedListクラスである私は、これは大学の割り当てのためにあるように台無しにしてしまうなどMVCContribのような任意のサードパーティ製のコンポーネントを使用したくありません」目的。

ページネーションは今すぐうまく動作しますが、私が検索して、 /?query = test結果をページングできるようにしたい、紛失してしまいます。私は/?query = test & page = 1

のようなものが必要になると推測しています。

+1

タイトルに「宿題」を追加する必要はありません。タグを追加する方が良い。あなたがdownvotedされている理由は、3つのほとんど同じ質問があるためです。問題を絞り込んだり、自分の研究にもっと力を入れてください。 –

+0

私は新しい質問を作成するように言われました。それは、元の質問を編集してコメントを投稿しなければならないと、問題が歪んだからです。 – Cameron

答えて

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 */ })%> 

を私はあなたをセットアップし直すかどうかはわかりません上記と同様のものが動作するはずです。 IQueryableオブジェクトをキャッシュすることもできますし、文字列クエリ自体をキャッシュすることもできますが、これは抽象レイヤー全体です。

+0

ええ、それは問題だった:)クエリが正常に動作し、問題は、ユーザーがナビゲートしてページが失われたときに述べたとおりです。しかし、私は今、Routeを使ってURLを/ Page/2のように変更しました。/Page/2?query = test。そして、はい、それをActionLinkに追加する方法の正しい方向を指摘する必要があります。ありがとう。 – Cameron

+0

[OK]を、私はいくつかの詳細と私の答えを更新します。 – TheRightChoyce

関連する問題