【问题标题】:Implementing IPagedList with my ViewModels用我的 ViewModel 实现 IPagedList
【发布时间】:2016-10-29 11:27:10
【问题描述】:

我在我的 ASP.NET MVC 应用程序上使用 NuGet PagedList.Mvc,我想返回查看 placesVM.ToPagedList(pageNumber, pageSize)

我尝试使用 PagedList 而不是 List。

我检查的示例似乎与我的场景不匹配,或者是吗?

您可以在下面找到我的实际代码。

视图模型

using PagedList;
using System.Collections.Generic;

namespace WhereWeDoIt.ViewModels
{
    public class PlacesIndexViewModel
    {
        public /*PagedList*/List<PlaceIndexViewModel> Places { get; set; }
        public string CurrentUserId { get; set; }
    }
}

控制器

public ActionResult Index(int? page)
{
    var config = new MapperConfiguration(cfg => cfg.CreateMap<Place, PlaceIndexViewModel>());
    var mapper = config.CreateMapper();

    var placesVm = new PlacesIndexViewModel { Places = new List<PlaceIndexViewModel>(), 
                                            CurrentUserId = User.Identity.GetUserId() };

    var placesBal = new PlaceBusinessLayer();
    var places = placesBal.GetAllPublic();

    placesVm.Places = mapper.Map<List<PlaceIndexViewModel>>(places);

    int pageSize = 3;
    int pageNumber = (page ?? 1);

    return View(placesVm/*.ToPagedList(pageNumber, pageSize)*/);
}

【问题讨论】:

  • 您的问题是什么?你有什么问题?
  • @StephenMuecke 如何返回查看placesVM.ToPagedList(pageNumber, pageSize)?
  • placesVm 只是一个对象。我猜您希望 Places 属性为 IPagedList
  • @StephenMuecke 如果我返回 placesVM.Places.ToPagedList(pageNumber, pageSize) 我将如何传递 CurrentUserId 属性?
  • Chris Pratt 添加了一个涵盖所有内容的答案,因此您应该接受。

标签: c# asp.net-mvc list pagination pagedlist


【解决方案1】:

如果您要将数据库中的记录映射到视图模型,则需要使用StaticPagedList

总的来说,斯蒂芬对你有一些好处。您的 repo 方法应该返回一个可查询的,而不是一个列表,因为这确实会在您应用任何分页逻辑之前实现所有记录。但是,如果您随后使用 AutoMapper 将它们映射到视图模型上,同样的事情仍然会发生。相反,您必须首先限制您的可查询:

var places = placesBal.GetAllPublic().Skip((pageNumber - 1) * pageSize).Take(pageSize);

您还需要一个单独的查询来获取总数。没有办法在一个查询中完成所有操作,但是计数查询很快。在这里,您不限制查询集,因为您需要总计数,而不仅仅是当前页面上的总数。

var totalPlaces = placesBal.GetAllPublic().Count();

然后,映射它:

var mappedPlaces = mapper.Map<List<PlaceIndexViewModel>>(places);

在最终更新StaticPagedList 的实例之前:

placesVm.Places = new StaticPagedList<PlaceIndexViewModel>(mappedPlaces, pageNumber, pageSize, totalPlaces);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多