asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET MVC分页控件的实现


发布日期:2023年03月18日
 
ASP.NET MVC分页控件的实现

需求及模拟代码

需求假设我们有个列表有分页功能我们可能需要一个页码列表

)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分页控件成

               

上一篇:asp.net后台获取js表格的数据

下一篇:ASP.NET取得页面事件的发生源控件ID