我已经在nerddinner教程的基础上实现了这个寻呼机。
我之前设置了它来列出第一个和最后一个链接之间的所有页面,但现在这已经失控了:)在下面的例子中,我有页面的HTML/代码块。我现在把第一个和最后一个链接之间的页码列表减少到只有10个。
然而,这种情况并没有改变。无论我在哪个页面,它仍然会列出1-10。我希望它能显示接下来10页的链接。任何帮助都将不胜感激!
<ul id="paginator">
<% if (Model.HasPreviousPage)
{ %>
<li>
<%= Html.RouteLink("First Page", new { namespaces = "Admin", controller = "Products", action = "ViewAll", page = 0 })%></li>
<% } %>
<% else %>
<% { %>
<li>First Page</li>
<% } %>
<% for (int i = 0; i < 10; i++) %>
<% { %>
<% if (i == Model.PageIndex) %>
<% { %>
<li>
<%: i+1 %></li>
<% } %>
<% else %>
<% { %>
<li>
<%= Html.RouteLink((i + 1).ToString(), new { namespaces = "Admin", controller = "Products", action = "ViewAll", page = i })%>
</li>
<% } %>
<% } %>-->
<% if (Model.HasNextPage)
{ %>
<li>
<%= Html.RouteLink("Last Page", new { namespaces = "Admin", controller = "Products", action = "ViewAll", page = Model.TotalPages - 1 })%></li>
<% } %>
<% else %>
<% { %>
<li>Last Page</li>
<% } %>
</ul>
您可以使用当前页面来决定将10个项目放置在何处,理想情况下,我想您希望在当前页面的两侧显示5个页面(或在当前页面两侧显示'n'个页面)。这个算法相当容易实现。。。
var startingPage = currentPage - 5;
var endingPage = currentPage + 5;
唯一复杂的是,如果起始页小于1,或者结束页大于最后一页,则需要填充10个结果。
最后,你需要处理没有11页结果的情况!
var startingPage = currentPage - 5;
if (startingPage < 1) {
startingPage = 1;
}
var endingPage = currentPage + 11;
if (endingPage > numberOfPages) {
endingPage = numberOfPages;
}
现在,您有了循环的开始和结束来创建页面链接,当前页面位于中间,但位于页面开始和结束处。
for (int i = startingPage; i < endingPage; i++)
您可以将硬编码的值从代码中移出,并缩短生产代码中的表达式——我已经用我认为会使概念变得最简单的方式做了一些事情。
我还建议将此逻辑移动到一个助手类中,如果您有多个页面需要此逻辑,该类可以在任何需要的地方创建页面链接。
您可以始终使用WebHelpers类中的WebGrid Helper(在NuGet上可用),它将为您提供所需的一切,包括分页,然后您只需要使用css对其进行样式设置。
Avery的好参考是:http://www.dotnetcurry.com/ShowArticle.aspx?ID=618