尝试在MVC4中使用ViewModel进行分页

问题描述 投票:2回答:2

我不想从数据库中获取所有项目并将它们转换为特定的Viewmodel,然后使用PagedList库来分页所有这些数据。

例如,我想在一个页面上获得20个项目,但我不知道何时将模型转换为viewmodel?

这是方法

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 );
}

此方法获取所有项目,然后将它们转换为ProductReviewListViewModel,然后对其进行分页。

我想要从数据库中仅获取20个项目并获得与上述相同的结果?

注意:GetItems方法返回IQueryable

添加的解决方案

我做了GetItems方法,还返回了总项数作为int参数。在控制器操作中,我使用StaticPagedList方法手动创建分页,例如this link

c# asp.net-mvc mvvm viewmodel pagedlist
2个回答
1
投票

我尚未测试以下内容,但会影响以下内容:

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 );
}

公式:(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)

因为它是一个IQueryable,这意味着您应该使用Take()和Skip()来从结果集中获取记录,所以只有在对它调用.ToPagedList时,它才会执行查询。

上面的警告是,我不确定ToPagedList()实现的样子,我假设您需要告诉它与您的查询匹配的总记录,以便它可以计算出多少个页面链接输出。


0
投票

您有一些选择,例如使用Jquery或Angular.js,也可以使用this example

尽管我在我的项目中使用了此简单代码,但效果很好:

tblNews.Skip((PageIndex * CountPerPage) - CountPerPage).Take(CountPerPage).ToList()
© www.soinside.com 2019 - 2024. All rights reserved.