【问题标题】:Trying to paging with ViewModel in MVC4尝试在 MVC4 中使用 ViewModel 进行分页
【发布时间】:2013-06-24 09:35:02
【问题描述】:

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

例如,我想在一个页面上获取 20 个项目,但我不明白什么时候应该将我的模型转换为视图模型?

这是方法

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,然后为其进行分页。

我想要的只是从 db 获得 20 个项目 并获得与上述相同的结果吗?

注意:GetItems 方法返回 IQueryable

添加的解决方案

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

【问题讨论】:

    标签: c# asp.net-mvc mvvm viewmodel pagedlist


    【解决方案1】:

    您有几个选择,例如使用 Jquery 或 Angular.js,或者您可以使用 this example

    虽然我在我的项目中使用了这个简单的代码并且它工作正常:

    tblNews.Skip((PageIndex * CountPerPage) - CountPerPage).Take(CountPerPage).ToList()
    

    【讨论】:

      【解决方案2】:

      我还没有测试过以下内容,但有一些影响:

      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() 实现是什么样的,我假设您需要告诉它与您的查询匹配的总记录,以便它可以计算多少页链接到输出。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-08
        • 2013-06-26
        • 2014-06-19
        • 2022-11-11
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多