Net學習日記_ASP.Net_MVC_AspNetMVC分頁

3.Pagerhtml

3.1需求及模擬代碼ui

需求,假設咱們有個列表,有分頁功能,咱們可能須要一個頁碼列表,如this

咱們模擬寫一下Action:spa

 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中我寫如下顯示方式:code

   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>

下面是運行後的結果:orm

第一頁URL相似/Home/Index?p=1server

第二頁URL相似/Home/Index?p=2htm

其它頁面以此類推blog

 

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:             );//顯示設置頁面後的連接
   7:         Writer.Write(" ");//鏈接後顯示個空格,好看點
   8:       
   9:     }%>

 

這個列表,咱們就能夠顯示爲

 

3.4完善這個Pager並封裝成一個Helper

上面列出了Pager,可是有幾個問題

  • 沒有上下頁
  • 沒有指定當前頁的特殊顯示
  • 每次調用時都要寫一次
  • 若是QueryString有其它參數時沒法處理

那咱們下面來完善這個Pager

並將之封裝成一個Helper

 1: /// <summary>
   2:      /// 分頁Pager顯示
   3:      /// </summary>
   4:      /// <param name="html"></param>
   5:      /// <param name="currentPageStr">標識當前頁碼的QueryStringKey</param>
   6:      /// <param name="pageSize">每頁顯示</param>
   7:      /// <param name="totalCount">總數據量</param>
   8:      /// <returns></returns>
   9:      public static string Pager(this HtmlHelper html, string currentPageStr, int pageSize, int totalCount)
  10:      {
  11:          var queryString = html.ViewContext.HttpContext.Request.QueryString;
  12:          int currentPage = 1; //當前頁
  13:          int.TryParse(queryString[currentPageStr], out currentPage); //與相應的QueryString綁定
  14:          var totalPages = Math.Max((totalCount + pageSize - 1) / pageSize, 1); //總頁數
  15:          var dict = new RouteValueDictionary(html.ViewContext.RouteData.Values);
  16:  
  17:          var output = new StringBuilder();
  18:  
  19:          foreach (string key in queryString.Keys)
  20:              if (queryString[key] != null && !string.IsNullOrEmpty(key))
  21:                  dict[key] = queryString[key];
  22:          if (totalPages > 1)
  23:          {
  24:              if (currentPage != 1)
  25:              {//處理首頁鏈接
  26:                  dict["p"] = 1;
  27:                  output.AppendFormat("{0} ",html.RouteLink("首頁", dict));
  28:              }
  29:              if (currentPage > 1)
  30:              {//處理上一頁的鏈接
  31:                  dict["p"] = currentPage - 1;
  32:                  output.Append(html.RouteLink("上一頁", dict));
  33:              }
  34:              else
  35:              {
  36:                  output.Append("上一頁");
  37:              }
  38:              output.Append(" ");
  39:              int currint = 5;
  40:              for (int i = 0; i <= 10; i++)
  41:              {//一共最多顯示10個頁碼,前面5個,後面5個
  42:                  if ((currentPage + i - currint) >= 1 && (currentPage + i - currint) <= totalPages)
  43:                      if (currint == i)
  44:                      {//當前頁處理
  45:                          output.Append(string.Format("[{0}]", currentPage));
  46:                      }
  47:                      else
  48:                      {//通常頁處理
  49:                          dict["p"] = currentPage + i - currint;
  50:                          output.Append(html.RouteLink((currentPage + i - currint).ToString(), dict));
  51:                      }
  52:                  output.Append(" ");
  53:              }
  54:              if (currentPage < totalPages)
  55:              {//處理下一頁的連接
  56:                  dict["p"] = currentPage + 1;
  57:                  output.Append(html.RouteLink("下一頁", dict));
  58:              }
  59:              else
  60:              {
  61:                  output.Append("下一頁");
  62:              }
  63:              output.Append(" ");
  64:              if (currentPage != totalPages)
  65:              {
  66:                  dict["p"] = totalPages;
  67:                  output.Append(html.RouteLink("末頁", dict));
  68:              }
  69:              output.Append(" ");
  70:          }
  71:          output.AppendFormat("{0} / {1}", currentPage, totalPages);//這個統計加不加都行
  72:          return output.ToString();
  73:      }

 

效果

相關文章
相關標籤/搜索