最近在写一些web应用了解了一下asp.net mvc发现的确好用,因此直接就干上了。不过在使用asp.net mvc的Razor模板的状况并不向传统webform那样可使用控件。但从Razor的功能上已经具有相关代替的功能,只是从Razor角度来讲不是咱们日常说的控件而是子模板。因为Razor能够根据本身需求把功能拆分到子模板中,而后经过RenderPage方法输出。从设计的手段上来看彻底能够把分页控件封装成一个子的cshtml,在须要的时候引用上就是了。html
做为一个控件的设计其最重要的环节是隔离和独立性,在这方面Razor也考虑得比较周到,经过PageData能够简单地进行模板之间的数据偶合问题。下面经过Razor实现一个简单的分页控件,在实现过程只须要编写一个简单的cshtml的模板便可。在使用上也并不须要引用什么代码或DLL,直接在须要的地方嵌入相关cshtml则能够分页控件的功能。web
一个控件要输出信息必须制定相关的数据规范,一个简单的分页控件其实只须要两个参数便可以,分别当前页索引和总页数。能够在Razor模板的顶部声音一下数据规范mvc
@{ int pageindex = (int)PageData["pageindex"]; int spitindex = 0; int pagecount = (int)PageData["pagecount"]; }
这两上参数就是告诉使用者在调用RenderPage输入的时候必须带上这两个参数值.asp.net
在一些数据查询中每每在URL上会带上一些相关参数,因此在输入分页URL的时候须要简单地处理一下。ui
@functions{ public static string GetUrl(int index) { System.Collections.Specialized.NameValueCollection querystring = HttpContext.Current.Request.QueryString; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("?").AppendFormat("pageindex=" + index); foreach(string key in querystring.Keys) { if (key != "pageindex") sb.AppendFormat("&{0}={1}", key, HttpContext.Current.Server.UrlEncode(querystring[key])); } return sb.ToString(); } }
简单地把pageindex附加到当前url querystring便可.url
有了以上信息那构建一个分页内容输出就是件简单的事情了。spa
<div class="pagebar"> <ul> <li id="pageinfo"><a>@Html.Raw(pageindex + 1) / @pagecount</a></li> @if (pageindex > 0) { <li><a href="@GetUrl(pageindex-1)">Previous</a> </li> } @{ spitindex = pageindex - 2;} @if (spitindex > 4) { <li><a href="@GetUrl(0)">1</a> </li> <li><a href="@GetUrl(spitindex - 2)">...</a> </li> } else { for (int i = 0; i < spitindex; i++) { <li><a href="@GetUrl(i)">@Html.Raw(i + 1)</a> </li> } } @for (int i = pageindex - 2; i < pageindex; i++) { if (i >= pageindex || i < 0) { continue; } <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li> } <li><a id="selectpage"><b>@Html.Raw(pageindex+1)</b> </a></li> @for (int i = pageindex + 1; i < pagecount; i++) { if (i >= pageindex + 3) { break; } <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li> } @{ spitindex = pageindex + 3; } @if (pagecount - 4 > spitindex) { <li><a href="@GetUrl(spitindex + 2)">...</a> </li> <li><a href="@GetUrl(pagecount - 1)">@pagecount</a> </li> } else { for (int i = spitindex; i < pagecount; i++) { <li><a href="@GetUrl(i)">@Html.Raw(i+1)</a> </li> } } @if (pageindex != pagecount - 1) { <li><a href="@GetUrl(pageindex + 1)">Next</a> </li> } </ul> </div>
控件使用很是简单只须要在Razor经过RenderPage输出便可.net
@RenderPage("~/views/controls/pagebar.cshtml", new { pageindex = Model.PageIndex, pagecount = Model.PageCount })
控件效果设计