【问题标题】:PagedList and AsyncPagedList 和异步
【发布时间】:2015-10-12 23:43:34
【问题描述】:

我在视图中使用 PagedList,但我的脚手架控制器是使用这种默认索引操作生成的:

public async Task<ActionResult> Index()
{
    return View(await db.Claimants.ToListAsync());
}

我没有找到与 async 一起使用的 PagedList 扩展。我的方法必须改成这样的形式:

public ActionResult Index(int? page)
{
    var claimants = db.Claimants.OrderBy(b => b.Name);
    var notNullPage = page ?? 1;
    return View(claimants.ToPagedList(notNullPage, 50));
}

是否有合理的方式来处理 PagedList 和 async

【问题讨论】:

    标签: c# asp.net-mvc async-await task-parallel-library pagedlist


    【解决方案1】:

    是否有合理的方式来使用 PagedList 和 async?

    是的。 EF 不是开箱即用的。但是,您可以获得PagedList.EntityFramework,它公开了ToPagedListAsync

    public class PagedListExtended<T> : BasePagedList<T> 
    {
        private PagedListExtended() 
        {
        }
    
        public static async Task<IPagedList<T>> Create(IQueryable<T> superset, int pageNumber, int pageSize) 
        {
            var list = new PagedListExtended<T>();
            await list.Init(superset, pageNumber, pageSize);
            return list;
        }
    
        async Task Init(IQueryable<T> superset, int pageNumber, int pageSize)
        {
            if (pageNumber < 1)
                  throw new ArgumentOutOfRangeException("pageNumber", pageNumber, "PageNumber cannot be below 1.");
            if (pageSize < 1)
                 throw new ArgumentOutOfRangeException("pageSize", pageSize, "PageSize cannot be less than 1.");
            TotalItemCount = superset == null ? 0 : await superset.CountAsync();
            PageSize = pageSize;
            PageNumber = pageNumber;
            PageCount = TotalItemCount > 0 ? (int) Math.Ceiling(TotalItemCount/(double) PageSize) : 0;
            HasPreviousPage = PageNumber > 1;
            HasNextPage = PageNumber < PageCount;
            IsFirstPage = PageNumber == 1;
            IsLastPage = PageNumber >= PageCount;
            FirstItemOnPage = (PageNumber - 1)*PageSize + 1;
            var num = FirstItemOnPage + PageSize - 1;
            LastItemOnPage = num > TotalItemCount ? TotalItemCount : num;
            if (superset == null || TotalItemCount <= 0)
                return;
            Subset.AddRange(pageNumber == 1 ? await superset.Skip(0).Take(pageSize).ToListAsync() : await superset.Skip((pageNumber - 1)*pageSize).Take(pageSize).ToListAsync());
        }
    }
    
    public static class PagedListExtendedExtensions 
    {
         public static async Task<IPagedList<T>> ToPagedListAsync<T>(this IQueryable<T> superset, int pageNumber, int pageSize)
         {
             return await PagedListExtended<T>.Create(superset, pageNumber, pageSize);
          }
    }
    

    【讨论】:

    • 工作就像一个魅力。谢谢!
    • Github 链接已损坏
    • 使用 ASP.NET MVC5,我建议升级到 X.PagedList 版本。 X.PagedList 下载了一堆不必要的 .Net Core 依赖项,并在我的视图中添加了我无法摆脱的警告。
    • 看起来那个项目已经过时了。过去 4 年没有更新。
    【解决方案2】:

    是的,你可以。

    您可以使用X.PagedList,它是 PagedList 的改进版本,支持异步操作。

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2013-06-12
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多