PagedList и асинхронность

Я использую PagedList в своих представлениях, но мой созданный контроллер генерируется с таким типом действия индекса по умолчанию:

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

Я не нашел расширения для PagedList для работы с async. Мои методы должны быть изменены на такую ​​​​форму:

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?


person Leonel Sanches da Silva    schedule 22.07.2015    source источник


Ответы (2)


Есть ли разумный способ работы с PagedList и асинхронностью?

Да. Не выходит из коробки с 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);
      }
}
person Yuval Itzchakov    schedule 22.07.2015
comment
Работал как шарм. Благодарю вас! - person Leonel Sanches da Silva; 23.07.2015
comment
Ссылка на гитхаб не работает - person Junior Mayhé; 06.05.2017
comment
При работе с ASP.NET MVC5 я рекомендую это вместо обновления до версии X.PagedList. X.PagedList загружает кучу ненужных зависимостей .Net Core и добавляет в мои представления предупреждения, от которых я не мог избавиться. - person Daniel Congrove; 08.03.2018
comment
Похоже, этот проект устарел. Никаких обновлений за последние 4 года. - person user1751825; 10.09.2019

Да, ты можешь.

Вы можете использовать X.PagedList, который является улучшенной версией PagedList и поддерживает асинхронные операции.

person t123yh    schedule 13.05.2016