上篇过后,被评为没有什么技术含量了,但我觉得这并没有什么问题,因为文章不一定会让所有人群受益,文章或适于新手,或适于熟手。 但凡是对人有所启发,我觉得写文章有值得。
而且我觉得这一系列主要是在开发中遇到的问题及解决方法,有容易想到的,有经过几次 开发迭代才形成的。还是那句话,这些未必是一些高效的技巧,但是的确是能解决问题,也未必有什么高深的原理,只是我觉得值得分享。
3.Pager
3.1需求及模拟代码
需求,假设我们有个列表,有分页功能,我们可能需要一个页码列表,如
我们模拟写一下Action:
1: public ActionResult Index(int? p)
2: {
3: if (!p.HasValue) p = 1;//如果未对p 传值就是第1页
4: var list = new List<int>();//生成一个模拟列表
5: for (var i = 0; i < 10;i++ )
6: {
7: list.Add(p.Value);//是第几页就向中填充几个这个页码的数
8: }
9: return View(list);//强型传递给View
10: }
View中我写以下显示方式:
1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<List<int>>" %>
2:
3: <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
4: Pager for List
5: </asp:Content>
6:
7: <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
8: <div>
9: <ul>
10: <%foreach (int i in Model){//显示这个列表%>
11: <li><%=i %></li>
12: <%} %>
13: </ul>
14: </div>
15: <!--将在这里显示分页的部分-->
16: </asp:Content>
下面是运行后 的结果:
第一页URL类似/Home/Index?p=1
第二页URL类似/Home/Index?p=2
其它页面以此类推
3.2 最简单的解决方 案
我想最简单无非就是直接写链接,当然也要考虑更换Routing规则的问题,所以我们可以最简单如下来写:
1: <%
2: int p = 1;
3: int.TryParse(Request.QueryString["p"], out p);
4: %>
5: <div>
6: <%=Html.ActionLink("上一页", "Index", new { p= p-1})%>
7: <strong>当前页:<%=p %></strong>
8: <%=Html.ActionLink("下一页 ", "Index", new { p= p+1})%>
9: </div>
这样就可以得到如果下的分页样式
当然,也可以根 据这个来写1,2,3,4,5页的链接,而不写“上一页”或“下一页”
但是这种方法有个问题,就是使用 Html.ActionLink的时候要用字符串来指定Action和Controller。下面我们来改换另一种方法来实现
3.3使用RouteLink来实现
我 们使用Html.RouteLink就可以实现不与Action或Controller的名称相耦合,例如:
1: <%for (int i = 1; i < 10; i++)
2: {
3: ViewContext.RouteData.Values["p"] = i;//设置页码
4: Writer.Write(
5: Html.RouteLink(i.ToString(), ViewContext.RouteData.Values)
6:
|