2010-07-08 7 views
0

Par exemple, cette liste contient une vue d'ensemble des documents et des besoins permettant la pagination. La liste est utilisée sur l'ensemble du site. Selon le contexte dans lequel il est utilisé, il a besoin des données d'une source différente. Par exemple, il peut être utilisé sur une page «groupe», où il doit charger les documents pour le groupe. Et il peut être utilisé sur une page «événement», où il doit charger les documents pour l'événement.Liste paginable réutilisable dans ASP.NET MVC2

Les deux situations peuvent également avoir un filtrage différent sur les documents contenant la page.

Si la liste ne possède pas de sources de données différentes, je pourrais facilement utiliser Html.RenderAction et commencer à travailler à partir de là. Mais dois-je fournir la liste avec des documents dans l'appelant, ou la liste doit-elle charger les documents, en fonction de filter/paging/... viewdata?

Répondre

0

Vous pouvez implémenter la liste en tant que vue partielle au lieu d'une action de contrôleur. Ensuite, vous pouvez utiliser RenderPartial pour rendre la liste et passer une liste d'objets différente en fonction de ce que la liste doit afficher.

Si vous passez dans un IEnumerable comme modèle par exemple, vous pouvez implémenter la pagination en utilisant quelque chose comme Model.Skip (page * pagesize) .Take (pagesize)

mis à jour

Il ne faut pas faire la pagination dans la vue. Il pourrait être une meilleure idée de créer une classe de modèle qui fait la pagination et est en fait testable et la passe dans la vue pour servir la bonne page de documents. Bien sûr, la vue est toujours responsable de l'affichage des pages et des liens vers d'autres pages.

Vous pourriez créer quelque chose comme une classe DocumentPager qui encapsule un IEnumerable et qui fait de la pagination. Cela ressemblerait à quelque chose comme ça

public class DocumentPager { 
    public IEnumerable<MyDocumentObject> DocSource { get; private set; } 
    public int PageSize { get; private set; } 

    public DocumentPager(IEnumerable<MyDocumentObject> docSource, int pageSize) { 
     DocSource = docSource; 
     PageSize = pageSize; 
    } 

    public IEnumerable<MyDocumentObject> GetPage(int pageNumber) { 
     return DocSource.Skip(..etc).Take(..etc); 
    } 

    public int NumPages { 
     get { return DocSource.Count()/PageSize; } 
    } 
} 

Vous pouvez ensuite passer ce dans la vue et dans votre vue partielle qui peut appeler la méthode GetPage et NumPages et des biens.

+0

Intéressant, mais lors de l'exécution Take(), le référentiel sous-jacent est appelé, puis le SQL est exécuté (pourrait travailler, je m en utilisant Linq à NHIbernate). Mais n'est-ce pas une approche étrange d'utiliser le Skip() et Take() dans le frontend? – Bertvan

+0

Ah, vous avez trouvé un point faible dans ma réponse. Et vous avez complètement raison, bien sûr. La pagination n'est pas vue-logique et ne devrait pas être dans la vue. Je pense que l'approche de base de l'utilisation d'une vue partielle qui peut rendre différentes données au lieu de Html.RenderAction est toujours valide, mais peut-être que nous pouvons pousser la pagination-logique dans une classe de vue. – Mendelt

+0

Ok, à ce stade, j'ai commencé à faire une approche similaire à celle que vous mentionnez dans votre réponse (DocumentPager). Avec cette différence, il est responsable du chargement des documents via le référentiel iso via un IEnumerable. Question suivante cependant: qu'en est-il du lien «Suivant» et «Précédent»? :) – Bertvan

0

Peut-être que vous pouvez faire quelque chose avec la classe PagedList de ScottGu qui se trouve ici: http://blog.wekeroad.com/2007/12/10/aspnet-mvc-pagedlistt/

+0

Cette liste paginée est une chose (j'ai une implémentation similaire en ce moment), mais elle ne fournit pas la solution complète d'avoir un composant frontend réutilisable. – Bertvan