ASP.NET MVC Pager分页

3.2最简单的解决方案

我想最简单无非就是直接写链接,当然也要考虑更换Routing规则的问题,所以我们可以最简单如下来写:

   <%

              int p = 1;

              int.TryParse(Request.QueryString["p"], out p);

    %>

 <div>

   <%=Html.ActionLink("上一页", "Index", new { p= p-1})%>

  <strong>当前页:<%=p %></strong>

  <%=Html.ActionLink("下一页", "Index", new { p= p+1})%>

 </div>


这样就可以得到如果下的分页样式

当然,也可以根据这个来写1,2,3,4,5页的链接,而不写“上一页”或“下一页”

但是这种方法有个问题,就是使用Html.ActionLink的时候要用字符串来指定Action和Controller。下面我们来改换另一种方法来实现

3.3使用RouteLink来实现

我们使用Html.RouteLink就可以实现不与Action或Controller的名称相耦合,例如:

    <%for (int i = 1; i < 10; i++)

        {

            ViewContext.RouteData.Values["p"] = i;//设置页码

           Writer.Write(

               Html.RouteLink(i.ToString(), ViewContext.RouteData.Values)

               );//显示设置页面后的链接

            Writer.Write(" ");//连接后显示个空格,好看点

         

       }%>


这个列表,我们就可以显示为

3.4完善这个Pager并封装成一个Helper

上面列出了Pager,但是有几个问题

·         没有上下页

·         没有指定当前页的特殊显示

·         每次调用时都要写一次

·         如果QueryString有其它参数时无法处理

那我们下面来完善这个Pager

并将之封装成一个Helper

 

   /// <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 = html.ViewContext.HttpContext.Request.QueryString;

           int currentPage = 1; //当前页

           int.TryParse(queryString[currentPageStr], out currentPage); //与相应的QueryString绑定

            var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); //总页数

            var dict = new RouteValueDictionary(html.ViewContext.RouteData.Values);

    

            var output = new StringBuilder();

    

            foreach (string key in queryString.Keys)

                if (queryString[key] != null && !string.IsNullOrEmpty(key))

                    dict[key] = queryString[key];

            if (totalPages > 1)

            {

                if (currentPage != 1)

                {//处理首页连接

                    dict["p"] = 1;

                    output.AppendFormat("{0} ",html.RouteLink("首页", dict));

                }

                if (currentPage > 1)

                {//处理上一页的连接

                    dict["p"] = currentPage - 1;

                    output.Append(html.RouteLink("上一页", dict));

                }

                else

                {

                    output.Append("上一页");

                }

                output.Append(" ");

                int currint = 5;

                for (int i = 0; i <= 10; i++)

                {//一共最多显示10个页码,前面5个,后面5个

                    if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages)

                        if (currint == i)

                        {//当前页处理

                            output.Append(string.Format("[{0}]", currentPage));

                        }

                        else

                        {//一般页处理

                            dict["p"] = currentPage + i - currint;

                            output.Append(html.RouteLink((currentPage + i - currint).ToString(), dict));

                        }

                    output.Append(" ");

                }

                if (currentPage < totalPages)

               {//处理下一页的链接

                    dict["p"] = currentPage + 1;

                    output.Append(html.RouteLink("下一页", dict));

                }

                else

                {

                    output.Append("下一页");

                }

                output.Append(" ");

                if (currentPage != totalPages)

                {

                    dict["p"] = totalPages;

                    output.Append(html.RouteLink("末页", dict));

                }

                output.Append(" ");

            }

            output.AppendFormat("{0} / {1}", currentPage, totalPages);//这个统计加不加都行

            return output.ToString();

        }


效果

 

发布了8 篇原创文章 · 获赞 1 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章