2009-07-23 2 views
1

J'ai une page de recherche que j'implémente dans le cadre d'un site ASP.NET + MVC + jquery. La requête de recherche marque chaque résultat renvoyé dans le jeu de résultats. c'est-à-dire un score plus élevé pour une correspondance plus étroite. Parce que les résultats peuvent changer, et parce que l'algorithme qui marque les correspondances est quelque peu intensif, je veux seulement charger les résultats une fois et trouver un moyen de cliquer sur les pages de résultats. J'ai pensé que je ferais une page qui contenait tous les résultats de la recherche (chaque résultat a son propre) et juste afficher/masquer un sous-ensemble en cliquant sur les boutons associés au code jquery. I pense Je peux voir comment faire ceci avant que je commence à essayer de le faire fonctionner (je suis encore assez nouveau à jquery), mais pensé que je verrais d'abord si quelqu'un a de meilleures idées.mvc jquery résultats de recherche de pagination avec seulement 1 requête

Merci d'avance pour toute suggestion.

Editer: La suggestion de Francisco était exactement ce dont j'avais besoin. Je l'ai implémenté avec quelques modifications mineures et j'ai créé des boutons jquery pour naviguer vers la première/précédente/prochaine/dernière page avec un libellé "Affichage des résultats n-m sur N". Merci pour toutes les suggestions.

+0

Ajouté une autre idée à vous de considérer! – redsquare

Répondre

1

Je pense que votre idée est assez bon.

Il suffit de mettre tous les éléments que vous voulez de chaque page dans différents divs. Ensuite, donnez la div un attribut class ou id qui est facilement identifiable, comme:

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

etc

Le code jQuery ressemblerait à ceci:

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

Edit:

Pour ce faire dynamiquement, créez une vue fortement typée associée à votre liste de résultats. L'en-tête de la vue doit être quelque chose comme:

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

Avec "résultat" étant votre classe:

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

Alors à votre avis, vous mettez ceci:

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

Ensuite, pour vos boutons:

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

Enfin, dans votre contrôleur:

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

Je l'ai considéré, mais comment le ferais-je de façon dynamique? Je ne sais pas à l'avance combien de pages il y aura. Je peux facilement générer les ID div pour contenir des numéros séquentiels, mais comment accéder à ces éléments en utilisant une variable pour le numéro de page en javascript? – user101306

+0

ajouté un peu de code pour cela – Francisco

+0

Merci @Francisco! Je pense que c'est ce que je veux faire. Laissez-moi essayer et revenir à vous. – user101306

1

Mettre en cache les résultats et la page dans le jeu de résultats mis en cache. Peut-être en utilisant une combinaison de jqGrid et JSON.

Cependant, vous n'incluez pas suffisamment d'informations pour que nous puissions vous donner la meilleure approche.

Vous devez d'abord faire quelques analyses.

Facteurs à considérer:

  • Combien de résultats est un utilisateur susceptible de regarder à travers?

  • Un utilisateur peut-il gérer autant d'informations sur une page?

  • La page va-t-elle être lente si vous affichez l'ensemble des résultats?

MISE À JOUR

Une autre option pourrait être d'utiliser infini défilement. Fondamentalement, comme l'utilisateur fait défiler les résultats et est vers la fin de l'écran, vous chargez automatiquement x plus de résultats. Plus here et here

+0

Merci d'avoir jeté un coup d'oeil. Je considère la mise en cache mais je ne sais pas comment faire ça. Les utilisateurs vont généralement voir 50-100 résultats, et j'ai prévu de faire des pages avec 5 résultats par page. Les résultats totaux sont trop grands pour mettre sur une page - chaque «résultat» est en fait quelques lignes et il y en a trop. Même 10 résultats sur une page signifie qu'un utilisateur devra faire beaucoup de défilement. Alors que les résultats sont longs, il n'y a pas vraiment beaucoup de données (~ 200 octets par résultat). Il y a juste quelque chose à propos du contenu (que je n'aborderai pas) qui signifie qu'il doit occuper une bonne partie de la surface de l'écran. – user101306

+0

Une autre idée, ajoutée à la réponse – redsquare

1

Avez-vous envisagé d'utiliser quelque chose comme Lucene.NET pour votre indexation? Lucene.NET fait un très bon travail en traitant des offsets pour la pagination. Les instances de document que vous renvoyez à partir de votre recherche peuvent contenir les valeurs de clé pour les enregistrements individuels ou vous pouvez également stocker suffisamment d'informations pour représenter les aspects visuels de chaque résultat de recherche pour chaque élément. Lorsque les pages de l'utilisateur, vous venez d'ajuster votre décalage.

Des choses comme la mise en cache et l'optimisation des requêtes sont intégrées. J'ai démonté et compilé il y a quelques semaines et j'avais un POC pour construire l'index, ajouter et supprimer des éléments de l'index, et retourner les résultats en quelques minutes en brouillant les échantillons ensemble. Je préfère de loin utiliser un index dédié à l'indexation, laissant la base de données fonctionner davantage comme un support de stockage dédié - mais c'est ma préférence personnelle.

Si vous décidez de le vérifier, tirez et compilez la source à partir de leur SVN. La version "stable" est un peu obsolète.

Edit:

Voici un bref exemple sur la pagination avec Lucene.NET: Paging using Lucene.net

+0

N'avait pas entendu parler de ça mais va le vérifier. Je voudrais généralement faire cela sans ajouter de technologie supplémentaire, et je pense que cela devrait déjà être possible en utilisant ASP.NET, MVC, LINQ to SQL et jquery - que j'utilise déjà. – user101306

+0

Compris. C'est tout à fait possible, il s'agit simplement de déterminer quelle charge attendra le système et de reconnaître que cela pourrait devenir un point à revoir plus tard. Selon le nombre d'enregistrements et le nombre d'utilisateurs simultanés, quelque chose comme Lucene.NET pourrait être exagéré. –

Questions connexes