2012-07-17 75 views
0

我做了Rick Anderson的ASP.NET MVC 3(C#)入門教程,是一個產品目錄,已經在工作,但是,由於我添加了一長串產品,現在我需要一個pagedList得到的只是一些每頁產品,環顧四周,我發現一個例子,但不工作,我的項目,我添加的模型文件,這個類名爲IPagedList.cs分頁列表不起作用

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace Presupuestos.Models 
{ 
    public interface IPagedList 
    { 
     int ItemCount 
     { 
      get; 
      set; 
     } 

     int PageCount 
     { 
      get; 
      set; 
     } 

     int PageIndex 
     { 
      get; 
      set; 
     } 

     int PageSize 
     { 
      get; 
      set; 
     } 

     bool IsPreviousPage 
     { 
      get; 
     } 

     bool IsNextPage 
     { 
      get; 
     } 
    } 

    public interface IPagedList<T> : IList<T>, IPagedList 
    { 
    } 

    public class PagedList<T> : List<T>, IPagedList<T> 
    { 
     private List<Productos> list; 
     private int p; 
     private int p_2; 

     public PagedList(IQueryable<T> source, int index, int pageSize) 
     { 
      this.ItemCount = source.Count(); 
      this.PageSize = pageSize; 
      this.PageIndex = index; 
      this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList()); 
      this.PageCount = (int)Math.Ceiling((double)this.ItemCount/this.PageSize); 
     } 

     public PagedList(List<T> source, int index, int pageSize) 
     { 
      this.ItemCount = source.Count(); 
      this.PageSize = pageSize; 
      this.PageIndex = index; 
      this.AddRange(source.Skip(index * pageSize).Take(pageSize).ToList()); 
     } 

     public PagedList(List<Productos> list, int p, int p_2) 
     { 
      // TODO: Complete member initialization 
      this.list = list; 
      this.p = p; 
      this.p_2 = p_2; 
     } 

     public int ItemCount 
     { 
      get; 
      set; 
     } 

     public int PageCount 
     { 
      get; 
      set; 
     } 

     public int PageIndex 
     { 
      get; 
      set; 
     } 

     public int PageSize 
     { 
      get; 
      set; 
     } 

     public bool IsPreviousPage 
     { 
      get 
      { 
       return (PageIndex > 0); 
      } 
     } 

     public bool IsNextPage 
     { 
      get 
      { 
       return (PageIndex + 1) * PageSize <= ItemCount; 
      } 
     } 
    } 

    public static class Pagination 
    { 
     public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index, int pageSize) 
     { 
      return new PagedList<T>(source, index, pageSize); 
     } 

     public static PagedList<T> ToPagedList<T>(this IQueryable<T> source, int index) 
     { 
      return new PagedList<T>(source, index, 10); 
     } 
    } 
} 

而且,我添加了另一個類名爲HTMLHelpers.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Text; 
using Presupuestos.Models; 

namespace Presupuestos.Models 
{ 
    public static class ListPaging 
    { 
     public static MvcHtmlString Paging(this HtmlHelper html, IPagedList pagedList, string url, string pagePlaceHolder) 
     { 
      StringBuilder sb = new StringBuilder(); 
      // only show paging if we have more items than the page size 
      if (pagedList.ItemCount > pagedList.PageSize) 
      { 
       sb.Append("<ul class=\"paging\">"); 
       if (pagedList.IsPreviousPage && pagedList.PageIndex != 1) 
       { 
        // previous link 
        sb.Append("<li class=\"prev\"><a href=\""); 
        sb.Append(url.Replace(pagePlaceHolder, (pagedList.PageIndex - 1).ToString())); 
        sb.Append("\" title=\"Go to Previous Page\">prev</a></li>"); 
       } 
       for (int i = 0; i < pagedList.PageCount; i++) 
       { 
        sb.Append("<li>"); 
        if (i == pagedList.PageIndex) 
        { 
         sb.Append("<span>").Append((i + 1).ToString()).Append("</span>"); 
        } 
        else 
        { 
         sb.Append("<a href=\""); 
         sb.Append(url.Replace(pagePlaceHolder, (i + 1).ToString())); 
         sb.Append("\" title=\"Go to Page ").Append((i + 1).ToString()); 
         sb.Append("\">").Append((i + 1).ToString()).Append("</a>"); 
        } 
        sb.Append("</li>"); 
       } 
       if (pagedList.IsNextPage) 
       { 
        // next link 
        sb.Append("<li class=\"next\"><a href=\""); 
        sb.Append(url.Replace(pagePlaceHolder, (pagedList.PageIndex + 1).ToString())); 
        sb.Append("\" title=\"Go to Next Page\">next</a></li>"); 
       } 
       sb.Append("</ul>"); 
      } 
      return MvcHtmlString.Create(sb.ToString()); 
     } 
    } 
} 

最後,這是視圖文件,我剛添加@u在最後唱presupuestos.models最後html.paging:

@model IEnumerable<Presupuestos.Models.Productos>   
@using Presupuestos.Models 

@{ 
    ViewBag.Title = "Productos"; 
} 

<h2>Catalogo de Productos</h2> 

<p> 
    @Html.ActionLink("Agregar Producto", "Create") 
</p> 
<table> 
    <tr> 
     <th> 
      Marca 
     </th> 
     <th> 
      Codigo 
     </th> 
     <th> 
      Nombre 
     </th> 
     <th> 
      Envase 
     </th> 
     <th> 
      Presentación 
     </th> 
     <th> 
      Linea 
     </th> 
     <th> 
      Categoria 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.marca) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.codigo) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.nombre) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.envase) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.presentación) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.linea) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.categoria) 
     </td> 
     <td> 
      @Html.ActionLink("Editar", "Edit", new { id = item.ID }) | 
      @Html.ActionLink("Detalles", "Details", new { id = item.ID }) | 
      @Html.ActionLink("Borrar", "Delete", new { id = item.ID }) 
     </td> 
    </tr> 
} 

</table> 
<div> 
@Html.Paging(new PagedList<Productos>(ViewData.Model.ToList(),1,10), Url.Action("Index","Index", new { page = "PAGENUM" }), "PAGENUM") 
</div> 

希望你能幫助我,我一直在堅持這一天,就在上週五,我開始使用MVC3,好的事情是什麼我的老闆需要的是教程中的內容,但是,現在我想要做這些額外的事情(pagedlist),我真的迷失了!

+0

請你能說一點更具體什麼不工作。 – ngm 2012-07-17 21:23:04

+0

如果您可以發佈IPagedList示例的來源,它也會有所幫助。 – ngm 2012-07-17 21:42:28

+0

我調試並運行,我可以看到數據庫中所有保存的記錄列表,但pagedlist不工作​​,不會出現在頁面的底部,我從這裏獲得代碼http:// forums。 ASP。net/t/1678594.aspx/1/10與一些撰稿人所做的更正 – Ivelisse 2012-07-18 02:39:19

回答

0

這看起來好像在這條線

@Html.Paging(new PagedList<Productos>(ViewData.Model.ToList(),1,10), Url.Action("Index","Index", new { page = "PAGENUM" }), "PAGENUM") 

你硬編碼的當前頁面的索引爲1

我猜你Index操作方法,你需要可能想擁有的東西代表您可以傳遞到您的視圖的當前頁面,並將硬編碼1替換爲您的視圖。

例如

public void Index(int page = 1) 
{ 
    // ... set up your view model 
    // ... 
    // ... 

    // page is added to the url by your paging helper. 
    ViewBag.CurrentPage = page; 

    return View(viewModel); 
} 

並在視圖...

@Html.Paging(new PagedList<Productos>(ViewData.Model.ToList(),@ViewBag.CurrentPage,10), Url.Action("Index","Index", new { page = "PAGENUM" }), "PAGENUM") 
+0

我編輯的變化看起來像這樣的'公共ViewResult索引(int page = 1) { ViewBag.CurrentPage = page; return View db.Productos.ToList()); }'並粘貼你在視圖中寫的東西,但仍然沒有任何反應 – Ivelisse 2012-07-18 02:43:47

0

根據你在您的評論說,該分頁列表不顯示在頁面的底部,我真的建議做一些調試並查看哪些代碼路徑實際上正在執行。但無論如何,我們可以猜到以下...

第一步是在ListPaging.Paging中放置一個斷點並檢查它實際上是否被調用。如果是,並且沒有任何東西被追加到您的StringBuilder中,那麼可能

if (pagedList.ItemCount > pagedList.PageSize) 
{ 
    // ... 

不計算爲真。我假設列表中的項目數量超過10個,所以它應該是真的。所以也許這不是評估爲真的原因是因爲沒有設置價值。

您添加的構造看起來半信半疑:

public PagedList(List<Productos> list, int p, int p_2) 
{ 
    // TODO: Complete member initialization 
    this.list = list; 
    this.p = p; 
    this.p_2 = p_2; 
} 

是PagedList採用甚至可以在這裏設置的屬性無。這個構造函數有什麼意義?什麼是pp_2?如果這個構造函數被調用,那麼ItemCount和PageSize將沒有任何價值。我建議擺脫它,讓其他構造函數被調用。

+0

是的!我擺脫它,我正在尋找一種新的方式來做到這一點,謝謝! – Ivelisse 2012-07-18 16:54:22