在 aspnetboilerplate 中进行分页和排序的简单方法

a simple approach for paging and sorting in aspnetboilerplate

在 asp.net 样板解决方案中是否有任何简单的方法在表示层中实现分页,例如 PagedList.Mvc Nuget 包中的 PagedList

我从 Nuget 库安装了 PagedList.Mvc 包并将我的索引方法更改为:

 public async Task<ActionResult> Index(int? page)
        {
            var pageIndex = (page ?? 1) - 1; //NewsService expects a 0 for the first page
            var pageSize = 3;
            int totalUserCount; // will be set by call to GetAllNews due to _out_ paramter :-|
            var newsResult = await _newsAppService.GetAllNews(new PagedResultRequestDto { MaxResultCount = pageSize });
            totalUserCount = newsResult.TotalCount;

            var news = newsResult.Items;
            var newsAsIPagedList = new StaticPagedList<NewsDto>(news, pageIndex + 1, pageSize, totalUserCount);

            ViewBag.OnePageOfNews = newsAsIPagedList;


            var model = new NewsListViewModel
            {
                News = news
            };

            return View(model);
        }

并且在视图中我在新闻 table 下添加了这个:

@Html.PagedListPager((IPagedList)ViewBag.OnePageOfNews, page => Url.Action("Index", new { page }))

但是当我点击数字时,例如数字 2 或 3,table 刷新但更改数据。

是的,您可以在演示视图中的样板应用程序中,如果它很小,那么您可以使用 bootstrap datatable 如果它不是那么您可以使用手动

对于分页,您可以使用手动 classes 和列表扩展功能

public static class ListExtensions
{
 public static PaginatedList<T> ToPagedList<T>(this IQueryable<T> list, int page, int pageSize)
{
    int count = list.Count();
    var items = list.Skip((page - 1) * pageSize).Take(pageSize).ToList();
    return new PaginatedList<T>(items, count, page, pageSize);
}
public static async Task<PaginatedList<T>> ToAsycPagedList<T>(this IQueryable<T> list, int page, int pageSize)
{
    return await PaginatedList<T>.CreateAsync(list, page, pageSize);
}
}

和分页 class 像这样

public class PaginatedList<T> : List<T>// where T: IQueryable<T>, IEnumerable<T>, ICollection<T>
{
public int PageIndex { get; private set; }
public int TotalPages { get; private set; }
public int RowCount { get; set; }
public int PageSize { get; set; }
public int FirstRowOnPage
{

    get { return (PageIndex - 1) * PageSize + 1; }
}
public int FirstPage
{

    get { return 1; }
}

public int LastRowOnPage
{
    get { return Math.Min(PageIndex * PageSize, RowCount); }
}
public int LastPage
{
    get { return (int)Math.Floor((decimal)RowCount / PageSize); }
}

public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
{
    PageIndex = pageIndex;
    RowCount = count;
    PageSize = pageSize;
    TotalPages = (int)Math.Ceiling(count / (double)pageSize);
    this.AddRange(items);
}

public bool HasPreviousPage
{
    get
    {
        return (PageIndex > 1);
    }
}

public bool HasNextPage
{
    get
    {
        return (PageIndex < TotalPages);
    }
}

public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
    var count = await source.CountAsync();
    var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
    return new PaginatedList<T>(items, count, pageIndex, pageSize);
}
}

添加这两个 class 后,您可以将其用作

var data = await list.OrderBy(x => x.fieldname).ToAsycPagedList(page, pageSize);
var data = list.OrderBy(x => x.fieldname).ToPagedList(page, pageSize);

ASP.NET Boilerplate 没有提供这个,但是按照你的建议使用起来很简单PagedList.Mvc

修改方便UsersController.Index to use manual paging:

public async Task<ActionResult> Index(int? page)
{
    var pageIndex = (page ?? 1) - 1;
    var pageSize = 10;
    int totalUserCount;

    var skipCount = pageIndex * pageSize;
    var pagedResult = await _userAppService.GetAll(new PagedResultRequestDto { MaxResultCount = pageSize, SkipCount = skipCount });
    totalUserCount = pagedResult.TotalCount;

    var users = pagedResult.Items;
    var usersAsIPagedList = new StaticPagedList<UserDto>(users, pageIndex + 1, pageSize, totalUserCount);

    ViewBag.OnePageOfUsers = usersAsIPagedList;

    // Code below unchanged
    var roles = (await _userAppService.GetRoles()).Items;
    var model = new UserListViewModel
    {
        Users = users,
        Roles = roles
    };
    return View(model);
}