PagedList and Async

后端 未结 2 679
庸人自扰
庸人自扰 2021-02-05 17:50

I\'m using PagedList in my Views, but my scaffolded Controller is generated with this kind of default Index Action:

public async Task Index()         


        
2条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-05 18:06

    Is there a reasonable way to work with PagedList and async?

    Yes. Doesn't come out of the box with EF. But, you can get PagedList.EntityFramework which exposes a ToPagedListAsync:

    public class PagedListExtended : BasePagedList 
    {
        private PagedListExtended() 
        {
        }
    
        public static async Task> Create(IQueryable superset, int pageNumber, int pageSize) 
        {
            var list = new PagedListExtended();
            await list.Init(superset, pageNumber, pageSize);
            return list;
        }
    
        async Task Init(IQueryable 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> ToPagedListAsync(this IQueryable superset, int pageNumber, int pageSize)
         {
             return await PagedListExtended.Create(superset, pageNumber, pageSize);
          }
    }
    

提交回复
热议问题