需求及模拟代码
需求假设我们有个列表有分页功能我们可能需要一个页码列表如
)thisstylewidth=; border=>
我们模拟写一下Action
public ActionResult Index(int? p)
{
if (!pHasValue) p = ;//如果未对p传值就是第页
var list = new List< int>();//生成一个模拟列表
for (var i = ; i < ;i++ )
{
listAdd(pValue);//是第几页就向中填充几个这个页码的数
}
return View(list);//强型传递给View View中我写以下显示方式
< %@ Page Language=C# MasterPageFile=~/Views/Shared/SiteMaster Inherits=SystemWebMvcViewPage< List< int>> %>
< asp:Content ID=indexTitle ContentPlaceHolderID=TitleContent runat=server>
Pager for List < /asp:Content>
< asp:Content ID=indexContent ContentPlaceHolderID=MainContent runat=server>
< div>
< ul>
< %foreach (int i in Model){//显示这个列表%>
< li>< %=i %>< /li>
< %} %>
< /ul>
< /div>
< !将在这里显示分页的部分>
< /asp:Content> 下面是运行后的结果
ASPNET MVC分页控件第一页URL类似/Home/Index?p=
image onmousewheel=javascript:return big(this) height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
ASPNET MVC分页控件第二页URL类似/Home/Index?p=
image onmousewheel=javascript:return big(this) height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
其它页面以此类推
ASPNET MVC分页控件最简单的解决方案
我想最简单无非就是直接写链接当然也要考虑更换Routing规则的问题所以我们可以最简单如下来写
< % int p = ; intTryParse(RequestQueryString[p] out p); %>
< div>
< %=HtmlActionLink(上一页 Index new { p= p})%>
< strong>当前页< %=p %>< /strong> < %=HtmlActionLink(下一页 Index new { p= p+})%>
< /div>
这样就可以得到如果下的分页样式
image onmousewheel=javascript:return big(this) height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
当然也可以根据这个来写页的链接而不写上一页或下一页
但是这种方法有个问题就是使用HtmlActionLink的时候要用字符串来指定Action和Controller下面我们来改换另一种方法来实现
使用RouteLink来实现
我们使用HtmlRouteLink就可以实现不与Action或Controller的名称相耦合例如
< %for (int i = ; i < ; i++)
{
ViewContextRouteDataValues[p] = i;//设置页码
WriterWrite( HtmlRouteLink(iToString() ViewContextRouteDataValues)
);
//显示设置页面后的链接
WriterWrite( );//连接后显示个空格好看点
}%>
这个列表我们就可以显示为
image onmousewheel=javascript:return big(this) height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
完善这个Pager并封装成一个Helper
上面列出了Pager但是有几个问题
没有上下页
没有指定当前页的特殊显示
每次调用时都要写一次
如果QueryString有其它参数时无法处理
那我们下面来完善这个Pager
并将之封装成一个Helper
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemWeb;
using SystemWebMvc;
using SystemWebRouting;
using SystemText;
using SystemWebMvcHtml;
namespace MvcApplicationHelpers
{
public static class PagerExtensions
{
/**//// < summary>
/// 分页Pager显示
/// < /summary>
/// < param name=html>< /param>
/// < param name=currentPageStr>标识当前页码的QueryStringKey< /param>
/// < param name=pageSize>每页显示< /param>
/// < param name=totalCount>总数据量< /param>
/// < returns>< /returns>
public static string Pager(this HtmlHelper html string currentPageStr int pageSize int totalCount)
{
var queryString = htmlViewContextHttpContextRequestQueryString;
int currentPage = ; //当前页
var totalPages = MathMax((totalCount + pageSize ) / pageSize );
//总页数
var dict = new SystemWebRoutingRouteValueDictionary(htmlViewContextRouteDataValues);
var output = new SystemTextStringBuilder();
if (!stringIsNullOrEmpty(queryString[currentPageStr]))
{
//与相应的QueryString绑定
foreach (string key in queryStringKeys)
if (queryString[key] != null && !stringIsNullOrEmpty(key))
dict[key] = queryString[key];
intTryParse(queryString[currentPageStr] out currentPage);
}
else
{
//获取 ~/Page/{page number} 的页号参数
intTryParse(dict[currentPageStr]ToString() out currentPage);
}
if (currentPage < = ) currentPage = ;
if (totalPages > )
{
if (currentPage != )
{
//处理首页连接
dict[currentPageStr] = ;
outputAppendFormat({} htmlRouteLink(首页 dict));
}
if (currentPage > )
{
//处理上一页的连接
dict[currentPageStr] = currentPage ;
outputAppend(htmlRouteLink(上一页 dict));
}
else
{
outputAppend(上一页);
}
outputAppend( );
int currint = ;
for (int i = ; i < = ; i++)
{
//一共最多显示个页码前面个后面个
if ((currentPage + i currint) >= && (currentPage + i currint) < = totalPages)
if (currint == i)
{
//当前页处理
outputAppend(stringFormat([{}] currentPage));
}
else
{
//一般页处理
dict[currentPageStr] = currentPage + i currint;
outputAppend(htmlRouteLink((currentPage + i currint)ToString() dict));
}
outputAppend( );
}
if (currentPage < totalPages)
{
//处理下一页的链接
dict[currentPageStr] = currentPage + ;
outputAppend(htmlRouteLink(下一页 dict));
}
else
{
outputAppend(下一页);
}
outputAppend( );
if (currentPage != totalPages)
{
dict[currentPageStr] = totalPages;
outputAppend(htmlRouteLink(末页 dict));
}
outputAppend( );
}
outputAppendFormat({} / {} currentPage totalPages);//这个统计加不加都行
return outputToString();
}
}
添加Controller代码
public ActionResult Index(int? page)
{
if (page == null)
page = ;
return View();
}
aspx页面调用
< %=HtmlPager(page )%>
效果
image onmousewheel=javascript:return big(this) height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
这回我们算是解决了这个问题ASPNET MVC分页控件成