PagedList 和异步
PagedList and Async
我在我的视图中使用 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
?
Is there a reasonable way to work with PagedList and 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);
}
}
是的,你可以。
您可以使用X.PagedList,它是PagedList 的改进版本,支持异步操作。
我在我的视图中使用 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
?
Is there a reasonable way to work with PagedList and 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);
}
}
是的,你可以。
您可以使用X.PagedList,它是PagedList 的改进版本,支持异步操作。