2009-07-23 27 views
1

私はASP.NET + MVC + jqueryサイトの一部として実装している検索ページを持っています。検索クエリは、結果セットの一部として返される各結果を評価します。近いマッチングのために高いスコアmvc jqueryページング検索結果が1つのクエリでのみ

結果セットが変更される可能性があるため、その得点試合アルゴリズムはやや集中的であるので、私は一度だけの結果をロードするために、結果のページをクリックする方法を見つけたいです。

私は、検索結果のすべてを含んでページを作る(各結果は、それ自身を持っている)だけ/ jqueryのコードに関連付けられたボタンをクリックすることでサブセットを隠すだろうと考え出しました。 I think私はそれが動作するようにしようとする前にこれを行う方法を見ることができます(私はまだjqueryをかなり新しくしています)。

ご意見ありがとうございます。

編集:サンフランシスコの提案は、私は必要なものだけでした。私はいくつかのマイナーチェンジでそれを実装し、最初の/前/次/最後のページにナビゲートするためのjqueryボタンをいくつか作成しました。すべての提案をありがとう。

+0

考慮すべき別のアイデアが追加されました。 – redsquare

答えて

1

私はあなたのアイデアが十分に良いと思います。

各ページのすべての要素を異なるdivに配置するだけです。

$("#page1").show(); 
$(".divpage").hide(); //this hides all other divs 

編集:

jQueryのコードは次のようになり

<div id="page1" class="divpage"> 
page 1 html here 
</div> 
<div id="page2" class="divpage"> 
page 2 html here 
</div> 

など

:その後のような、div要素に容易に識別可能であるクラスまたはID属性を与えます

これを動的に実行するには、結果リストに関連付けられた強く型付けされたビューを作成します。以下のためにその後

<%int resultsPerPage = 10; 
int currentResults = 0; 
int numPage=0; 

foreach(var item in Model) 
{ 
    if (currentResults==0) Response.Write("<div id=\"page"+numPage+"\" class=\"divpage\">"); 
    %> 

    <%=item.score.ToString()%> 
    <%=item.data%> 

    <%currentResults++; 
    if (currentResults>resultsPerPage) 
    { 
     numPage++; 
     currentResults=0; 
     Response.Write("</div>"); 
    } 
}%> 

<%if (currentResults!=0) Response.Write("</div>");%> 

:次に、あなたのビューでは、あなたがこれを置く

public class Result 
{ 
    int score {get;set;} 
    string data {get;set;} 
} 

: "結果が" あなたのクラスであることで

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Result>>" %> 

:ビューのヘッダのようなものでなければなりませんあなたのボタン:

<%for (int i=0;i<numPage;i++) 
{ 
%> 
<a href="" onclick="showPage('<%=i%>');return false;">Page <%=i%></a> 

<%}%> 

<script type="text/javascript"> 

function showPage(num) 
{ 
    $("#page"+num).show(); 
    $(".divpage").hide(); 
} 

</script> 

最後に、あなたのコントローラーで:

public ActionResult ShowResults() 
{ 
    List<Result> results = getResultsOrdererdByScoreFunction(); 
    return View(results); 
} 
+0

私はそれを考えましたが、私はそれをどのように動的に行いますか?私はあらかじめいくつのページがあるのか​​分からない。私は簡単にシーケンス番号を含むdivのIDを生成することができますが、1つは、javascriptのページ番号の変数を使用してこれらの要素にアクセスするのですか? – user101306

+0

にそのコードを追加しました – Francisco

+0

ありがとう@Francisco!私はこれが私がしたいことだと思います。それを試してみましょう。 – user101306

1

キャッシュ結果セットに結果とページをキャッシュします。おそらく、jqGridとjsonの組み合わせを使用しています。

しかし、あなたには最良のアプローチを提供するのに十分な情報が含まれていません。

まず解析を行う必要があります。考慮すべき

要因:

  • への可能性が高いユーザーが目を通すされてどのように多くの結果?

  • ユーザーは1ページで多くの情報を扱うことができますか?

  • 結果セット全体をレンダリングするとページが遅くなりますか?

UPDATE

もう一つの選択肢は無限スクロールを使用することができます。基本的に、ユーザーが結果をスクロールして画面の最後に行くと、さらにx個の結果が自動的にロードされます。 More herehere

+0

ありがとうございます。私はキャッシングを検討していますが、その方法はわかりません。 ユーザーには通常50〜100件の結果が表示され、1ページに5件の結果を表示するよう計画されています。合計の結果は大きすぎるため、1ページに収めることはできません。それぞれの結果は実際には数行にすぎず、多すぎます。ページ上に10個の結果があっても、ユーザーは多くのスクロールを行う必要があります。 結果が長い間は、実際にはそれほど多くのデータ(結果あたり〜200バイト)はありません。かなりの画面領域を占有しなければならないことを意味する内容(私が入ることはない)に関するものがあります。 – user101306

+0

別のアイデア、回答に追加 – redsquare

1

インデックス作成にはLucene.NETのようなものを使用することを検討しましたか? Lucene.NETは、ページングのオフセットを処理する上で非常に優れた仕事をします。検索結果から返されたDocumentインスタンスには、個々のレコードのキー値が含まれていたり、各アイテムの各検索結果の視覚的な側面を表すのに十分な情報を格納することもできます。

ユーザーがページするときは、オフセットを調整するだけです。クエリキャッシングや最適化などの機能が組み込まれています。私は数週間前にプルダウンしてコンパイルし、インデックスを作成し、インデックスから項目を追加したり削除したりして、サンプルを一緒に並べるだけで数分で結果を返すPOCを持っていました。私は索引付けのために専用索引を使用する方が好きで、データベースを専用記憶媒体としてさらに機能させることが望ましいですが、それは私の個人的な好みです。

チェックアウトする場合は、SVNからソースを取り出してコンパイルしてください。 「安定版」は少し古くなっています。

編集:

ここではLucene.NETとページングの簡単な例です:Paging using Lucene.net

+0

それについて聞いたことはありませんが、それをチェックします。私は一般的に、追加の技術を追加しなくてもこれをやりたいと思っています。ASP.NET、MVC、LINQ to SQL、jqueryを使用してこれが可能であるはずです。 – user101306

+0

。間違いなく、予想される負荷がシステム上でどのようなものになるのかを判断し、後で再訪するポイントになる可能性があることを認識するだけです。レコード数と同時ユーザー数に応じて、Lucene.NETのようなものは過度のものかもしれません。 –

関連する問題