2013-06-27 4 views
2

Je ne veux pas obtenir tous les éléments de la base de données et les convertir en un viewmodel spécifique, puis utiliser la bibliothèque PagedList pour faire apparaître toutes ces données.Essayer de paginer avec ViewModel dans MVC4

Par exemple je veux obtenir 20 articles à une page mais je ne comprends pas quand devrais-je convertir mon modèle au viewmodel?

Ceci est la méthode

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel) 
{ 
    var items = 
     _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId) 
          .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>); 

    var result = items.ToPagedList(filterViewModel.PageIndex, 20); 

    return View(result); 
} 

Cette méthode obtient tous les éléments les convertir ensuite à la ProductReviewListViewModel puis faire la pagination pour elle.

Ce que je veux obtenir seulement 20 articles de DB et obtenir le même résultat que ci-dessus?

Note: GetItems retour méthode IQueryable

SOLUTION AJOUTÉE

Je l'ai méthode GetItems, retour également des articles au total comptent comme paramètre out int. Dans l'action du contrôleur, j'utilise la méthode StaticPagedList pour créer la pagination manuelle comme this link dit

Répondre

1

Je ne l'ai pas testé le ci-dessous, mais quelque chose à ce effet:

public ViewResult Index(ProductReviewRelationalFilterViewModel filterViewModel) 
{ 
    var pageSize = 20; 
    var skipRecords = (filterViewModel.PageIndex > 1 ? (filterViewModel.PageIndex - 1) * pageSize + (filterViewModel.PageIndex - 2) : 0); 
    var items = 
     _productreviewService.GetItems(filterViewModel.ProductId, filterViewModel.UserId) 
          .Skip(skipRecords).Take(pageSize) 
          .Select(AutoMapper.Mapper.Map<ProductReviewListViewModel>); 

    var result = items.ToPagedList(filterViewModel.PageIndex, 20); 

    return View(result); 
} 

Formule: (pageIndex> 1 (pageIndex - 1) * pageSize + (pageIndex - 2): 0)

page 1 = 0 = skip 0 take 20 
page 2 = (2 - 1) 1 * 20 + (2 - 2) 0 = skip 20 take 20 
page 3 = (3 - 1) 2 * 20 + (3 - 2) 1 = skip 41 take 20 
page 4 = (4 - 1) 3 * 20 + (4 - 2) 2 = skip 62 take 20 
page 5 = (5 - 1) 4 * 20 + (5 - 2) 3 = skip 83 take 20 

Results: 
page 1 - skip 0 take 20 (shows record 0 - 20) 
page 2 - skip 20 take 20 (shows record 21 - 41) 
page 3 - skip 41 take 20 (shows record 42 - 62) 
page 4 - skip 62 take 20 (shows record 63 - 83) 

Parce que ce IQueryable cela signifie que vous devez utiliser Take() et Skip() pour récupérer les enregistrements de l'ensemble de résultats, il n'exécutera la requête une fois que vous appelez .ToPagedList dessus. Un inconvénient avec ce qui précède est que je ne suis pas sûr de l'apparence de l'implémentation de ToPagedList(), je suppose que vous devez lui indiquer le nombre total d'enregistrements correspondant à votre requête afin de pouvoir calculer le nombre page liens vers la sortie.

Questions connexes