2009-07-23 1 views
1

Ich habe eine Suchseite, die ich als Teil einer ASP.NET + MVC + jquery-Site implementiere. Die Suchabfrage bewertet jedes Ergebnis, das als Teil der Ergebnismenge zurückgegeben wird. d. h. höhere Punktzahl für engere Übereinstimmung.mvc jquery paging Suchergebnisse mit nur 1 Abfrage

Da sich die Ergebnismenge ändern kann und weil der Algorithmus, mit dem die Übereinstimmungen bewertet werden, ziemlich intensiv ist, möchte ich die Ergebnisse nur einmal laden und eine Möglichkeit finden, durch die Ergebnisseiten zu klicken.

Ich dachte mir, dass ich eine Seite erstellen würde, die alle Suchergebnisse enthält (jedes Ergebnis hat ihre eigenen) und zeige/verstecke nur eine Teilmenge, indem ich auf Buttons mit jQuery Code klicke. I denke, Ich kann sehen, wie dies zu tun, bevor ich versuche, es funktioniert (ich bin immer noch ziemlich neu zu jquery), aber dachte, ich würde zuerst sehen, ob jemand bessere Ideen hat.

Vielen Dank im Voraus für Anregungen.

Bearbeiten: Francisco Vorschlag war genau das, was ich brauchte. Ich habe es mit einigen kleineren Änderungen implementiert und einige jquery-Buttons erstellt, um zur ersten/vorherigen/nächsten/letzten Seite zu navigieren, zusammen mit der Anzeige "Ergebnisse n-m aus N". Danke für alle Vorschläge.

+0

Hinzugefügt eine andere Idee für Sie zu prüfen! – redsquare

Antwort

1

Ich denke, Ihre Idee ist gut genug.

Setzen Sie einfach alle Elemente, die Sie von jeder Seite wünschen, in verschiedene divs. Dann geben die div eine Klasse oder id-Attribut, das leicht erkennbar ist, wie zum Beispiel:

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

etc

Der Code jQuery würde wie folgt aussehen:

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

Edit:

Um dies dynamisch auszuführen, erstellen Sie eine stark typisierte Ansicht, die Ihrer Ergebnisliste zugeordnet ist. Der Header der Ansicht sollte etwas sein wie:

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

Mit "Ergebnis" ist Ihre Klasse:

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

Dann Ihrer Ansicht nach folgendes gesagt:

<%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>");%> 

dann für Ihre Knöpfe:

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

Schließlich in Ihrem Controller:

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

Ich dachte darüber nach, aber wie würde ich das dynamisch machen? Ich weiß nicht im Voraus, wie viele Seiten es geben wird. Ich kann die divids leicht erzeugen, um sequentielle Zahlen zu enthalten, aber wie man auf diese Elemente unter Verwendung einer Variablen für die Seitennummer in Javascript zugreift? – user101306

+0

hinzugefügt Code für das – Francisco

+0

Danke @Francisco! Ich denke, das möchte ich tun. Lass es mich ausprobieren und komme zu dir zurück. – user101306

1

Die Ergebnisse zwischenspeichern und das zwischengespeicherte Resultset durchblättern. Vielleicht mit einer Kombination aus jqGrid und json.

Allerdings enthalten Sie nicht genügend Informationen für uns, um den besten Ansatz zu geben.

Sie müssen zuerst eine Analyse durchführen.

Faktoren zu berücksichtigen:

  • Wie viele Ergebnisse wird ein Benutzer wahrscheinlich durch aussehen?

  • Kann ein Benutzer mit so vielen Informationen auf einer Seite umgehen?

  • Wird die Seite langsam, wenn Sie die gesamte Ergebnismenge rendern?

UPDATE

Eine weitere Option könnte unendlich sein Scroll zu benutzen. Grundsätzlich, wenn der Benutzer scrollt die Ergebnisse und ist gegen Ende des Bildschirms laden Sie automatisch in x mehr Ergebnisse. Weitere here und here

+0

Danke für einen Blick. Ich überlege Caching, aber ich weiß nicht, wie ich das machen soll. Benutzer werden in der Regel 50-100 Ergebnisse sehen, und ich plante, Seiten mit 5 Ergebnissen pro Seite zu erstellen. Die Gesamtergebnisse sind zu groß, um auf eine Seite zu passen - jedes "Ergebnis" ist eigentlich ein paar Zeilen und es gibt einfach zu viel. Sogar 10 Ergebnisse auf einer Seite bedeutet, dass ein Benutzer viel scrollen muss. Während die Ergebnisse lang sind, gibt es nicht wirklich so viele Daten (~ 200 Bytes pro Ergebnis). Es gibt nur etwas über den Inhalt (auf den ich nicht eingehen werde), das bedeutet, dass es ziemlich viel Bildschirmfläche einnehmen muss. – user101306

+0

Eine andere Idee, die Antwort hinzugefügt – redsquare

1

Haben Sie in Betracht gezogen, etwas wie Lucene.NET für Ihre Indexierung zu verwenden? Lucene.NET ist sehr gut im Umgang mit Offsets für Paging. Die Dokumentinstanzen, die Sie von Ihrer Suche zurückgeben, können die Schlüsselwerte für die einzelnen Datensätze enthalten, oder Sie können genügend Informationen speichern, um die visuellen Aspekte für jedes Suchergebnis für jedes Element darzustellen.

Bei den Benutzerseiten passen Sie einfach Ihren Offset an. Dinge wie Query-Caching und -Optimierung sind integriert. Ich habe vor ein paar Wochen einen POC erstellt und kompiliert, um den Index zu erstellen, Elemente aus dem Index hinzuzufügen und zu entfernen und Ergebnisse in nur wenigen Minuten durch Zusammenfügen der Samples zu erhalten. Ich bevorzuge viel lieber einen dedizierten Index für die Indizierung und lasse die Datenbank eher als dediziertes Speichermedium arbeiten - aber das ist meine persönliche Vorliebe.

Wenn Sie sich entscheiden, es auszuprobieren, ziehen Sie und kompilieren Sie die Quelle von ihrem SVN. Die "stabile" Version ist etwas veraltet.

Edit:

Hier ist ein kurzes Beispiel auf Paging mit Lucene.NET: Paging using Lucene.net

+0

Hatte nicht davon gehört, aber werde es überprüfen. Im Allgemeinen möchte ich dies tun, ohne zusätzliche Technologie hinzuzufügen, und ich denke, dass dies bereits mit ASP.NET, MVC, LINQ to SQL und jquery möglich sein sollte - alles, was ich bereits verwende. – user101306

+0

Verstanden. Es ist definitiv möglich, es kommt nur darauf an, zu bestimmen, wie hoch die zu erwartende Belastung des Systems sein wird, und zu erkennen, dass dies zu einem Punkt werden könnte, der zu einem späteren Zeitpunkt noch einmal überprüft werden muss. Abhängig von der Anzahl der Datensätze und der Anzahl der gleichzeitigen Benutzer ist etwas wie Lucene.NET möglicherweise übertrieben. –