针对这个话题,我将提供一个完整的攻略来实现一个支持普通分页和综合分页的MVC分页Helper。
目录
前言
MVC中的分页是非常常见的需求,通过分页我们可以实现对数据的有序浏览和管理。普通分页的实现其实并不是太难,但是如何实现综合分页则有些复杂。在这里,我将给出一种统一的方法,实现一个可以同时支持普通分页和综合分页的MVC分页Helper。
步骤1:创建分页Helper
首先,我们需要创建一个MVC分页Helper。它将接受以下参数:
- totalCount: 包含在分页中的数据总数。
- pageSize: 分页大小,即每页包含的条目数。
- currentPage: 当前页码数。
- actionName: 控制器中处理此请求的操作名称。
- routeValues: 路由值,包含请求中的所有参数。
首先,我们需要创建一个扩展方法来创建MVC分页Helper。
public static class PaginationHelper
{
public static MvcHtmlString Pager(
this HtmlHelper html,
int totalRecords,
int pageSize,
int currentPage,
string actionName,
object routeValues = null)
{
// 分页逻辑
}
}
接下来,我们需要完成分页逻辑。在此方法中,我们需要计算出总页数,以及当前页的前N个和后N个页码。我们还需要创建分页链接,使用户能够在分页之间导航。
下面是实现这些逻辑的示例代码:
public static MvcHtmlString Pager(
this HtmlHelper html,
int totalRecords,
int pageSize,
int currentPage,
string actionName,
object routeValues = null)
{
var totalPages = (int)Math.Ceiling((double)totalRecords / pageSize);
var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
var currentPageUrl = urlHelper.Action(actionName, routeValues);
var output = new StringBuilder();
if (totalPages < 2)
{
return MvcHtmlString.Empty;
}
output.Append("<ul class=\"pagination\">");
if (currentPage > 1)
{
var prevPageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
{
["page"] = currentPage - 1
});
output.AppendFormat("<li><a href='{0}'>«</a></li>", prevPageUrl);
}
int startPage = 1, endPage = 1;
const int maxPagesToShow = 9;
if (totalPages <= maxPagesToShow)
{
startPage = 1;
endPage = totalPages;
}
else
{
var middlePage = currentPage - (maxPagesToShow / 2);
if (middlePage > totalPages - maxPagesToShow)
{
middlePage = totalPages - maxPagesToShow + 1;
}
if (middlePage < 1)
{
middlePage = 1;
}
startPage = middlePage;
endPage = middlePage + maxPagesToShow - 1;
}
for (int i = startPage; i <= endPage; i++)
{
var pageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
{
["page"] = i
});
if (i == currentPage)
{
output.AppendFormat("<li class='active'><a href='{0}'>{1}</a></li>", pageUrl, i);
}
else
{
output.AppendFormat("<li><a href='{0}'>{1}</a></li>", pageUrl, i);
}
}
if (currentPage < totalPages)
{
var nextPageUrl = urlHelper.Action(actionName, new RouteValueDictionary(routeValues)
{
["page"] = currentPage + 1
});
output.AppendFormat("<li><a href='{0}'>»</a></li>", nextPageUrl);
}
output.Append("</ul>");
return MvcHtmlString.Create(output.ToString());
}
步骤2:使用分页Helper
在步骤1中,我们创建了一个名为“Pager”的MVC分页Helper。现在我们来演示如何使用它。
@Html.Pager(
totalRecords: 100,
pageSize: 10,
currentPage: ViewBag.CurrentPage,
actionName: "Index",
routeValues: new { q = Request.QueryString["q"] })
在这个示例中,我们将分页帮助程序嵌入视图文件中。它用于管理一组包含在满足某些搜索条件的结果集中的结果。
通过指定当前页,总记录数,页大小和Action名称以及当前请求参数等信息,分页帮助程序可以生成分页代码。
示例1:普通分页
下面是一个示例,演示了如何使用我们的MVC分页Helper来创建普通分页。
public ActionResult Index(int page=1)
{
var pageSize = 10;
var data = _repository.GetAll().OrderBy(x => x.Name).Skip((page - 1) * pageSize).Take(pageSize).ToList();
var totalCount = _repository.GetAll().Count;
ViewBag.CurrentPage = page;
return View(data);
}
在这个示例中,我们从存储库中获取所有数据,并对其进行排序。然后,我们使用MVC分页Helper根据分页大小和请求页面的页码生成分页代码。
示例2:综合分页
下面是一个示例,演示如何使用我们的MVC分页Helper来创建综合分页。
public ActionResult Index(string category = null, int page = 1)
{
var pageSize = 10;
IQueryable<Product> data = _repository.GetAll();
if (!string.IsNullOrEmpty(category))
{
data = data.Where(x => x.Category == category);
}
var totalCount = data.Count();
var products = data.Skip((page - 1) * pageSize).Take(pageSize).ToList();
ViewBag.CurrentPage = page;
ViewBag.Category = category;
ViewBag.Categories = new SelectList(_repository.GetAllCategories());
return View(products);
}
在这个示例中,我们从库中获取所有产品,然后过滤结果以匹配指定的类别。 然后,我们使用MVC分页帮助程序根据过滤和分页参数生成分页代码。
这里的例子有两条:
- 通过一个查询参数
category
进行搜索筛选,并且可通过分页控件进行分页展示。 - 可以进行多条件综合搜索,比如多选时即传递一个数组的参数,同时把当前的页码、每页显示的记录数以及其它必要信息传递进去。
到这里,本攻略就结束了。我们可以使用相同的方法来创建其他的MVC分页help,例如针对Web API分页,以及单页应用程序(SPA)中的分页。如果你认为我遗漏了什么,请在评论中告诉我!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个支持普通分页和综合分页的MVC分页Helper - Python技术站