最近在寫一些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 })
控件效果設計