2011-01-11 5 views
-1

Ich versuche, eine sehr einfache Anwendung mit ASP.NET MVC zusammen, die Nachrichtenartikel und paginiert sie zusammen. Ich bin irgendwie auf halbem Weg, brauche aber Hilfe beim Aussortieren der Seitennummerierung und der Arbeit mit der Suchanfrage.(Hausaufgaben) MVC Paginierung Hilfe

Hier ist mein Homecontroller:

public ActionResult Index(String query, int? page) 
{ 
     // limit the number of articles per page 
     const int pageSize = 4; 
     // build the query 
     var ArticleQuery = from a in _db.ArticleSet select a; 
     // check if their is a query 
     if (!string.IsNullOrEmpty(query)) 
     { 
      ArticleQuery = ArticleQuery.Where(a => a.headline.Contains(query)); 
     } 
     // orders the articles 
     var OrderedArticles = ArticleQuery.OrderByDescending(a => a.posted); 
     // takes the ordered articles and paginates them 
     //var paginatedArticles = new PaginatedList(OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize), page ?? 0, pageSize); 
     var paginatedArticles = new PaginatedList<Article>(OrderedArticles, page ?? 0, pageSize); 
     // return the paginated articles to the view 
     return View(paginatedArticles); 
} 

Die Idee ist, dass der Controller zeigt 4 Artikel pro Seite werden sie nach Datum bestellen. Hier ist die Ansicht I für die Index-Methode habe:

<ul id="pagination"> 
    <% if (Model.PreviousPage) { %> 
     <li><%= Html.ActionLink("<< First Page", "Index")%></li> 
     <li><%= Html.ActionLink("<< Previous Page", "Index", new { page=(Model.PageIndex-1) }) %></li> 
    <% } %> 
    <% if (Model.NextPage) { %> 
     <li><%= Html.ActionLink("Next Page >>", "Index", new { page = (Model.PageIndex + 1) })%></li> 
     <li><%= Html.ActionLink("Last Page >>", "Index", new { page = (Model.TotalPages - 1) })%></li> 
    <% } %>  
</ul> 

Die Idee ist, dass diese beide Paginierung Links werden nur angezeigt, wenn die Bedingungen erfüllt sind.

Schließlich ist hier die PaginatedList Klasse für den Pager:

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

namespace NewsApp.Models 
{ 
    public class PaginatedList<T> : List<T> 
    { 
     public int PageIndex { get; private set; } 
     public int PageSize { get; private set; } 
     public int TotalCount { get; private set; } 
     public int TotalPages { get; private set; } 

     public PaginatedList(IQueryable<T> source, int pageIndex, int pageSize) 
     { 
      PageIndex = pageIndex; 
      PageSize = pageSize; 
      TotalCount = source.Count(); 
      TotalPages = (int)Math.Ceiling(TotalCount/(double)PageSize); 

      this.AddRange(source.Skip(PageIndex * PageSize).Take(PageSize)); 
     } 
     public bool HasPreviousPage 
     { 
      get 
      { 
       return (PageIndex > 0); 
      } 
     } 
     public bool HasNextPage 
     { 
      get 
      { 
       return (PageIndex + 1 < TotalPages); 
      } 
     } 
    } 

HINWEIS: Ich will keine 3rd-Party-Komponenten wie MVCContrib usw. verwenden, wie dies für eine Zuordnung Universität ist so das würde besiegen Zweck.

Die Paginierung funktioniert jetzt gut, aber wenn ich eine Suche mache und z. /? query = test Ich möchte in der Lage sein, die Ergebnisse zu pagen, wenn sie verloren gehen:/

Vielen Dank.

+0

beantwortet gerade etwas ähnliches: http://stackoverflow.com/questions/4659978/asp-net-mvc-pagination-using-take-and-skip/4662573#4662573 – Omu

+0

alle Aktualisierungen danken Ihnen. – Cameron

+0

Google gegoogelt CHT2520, weil ich verdächtig war. Nur Ergebnisse sehen wie Schulklassenpläne aus. Sieht aus, als hätte morgen jemand Hausaufgaben? – jfar

Antwort

2

Sie zitieren nicht, was Sie tatsächlich Fehler sind, aber ich glaube, ich sehe, was falsch ist:

Diese beiden Linien Ihr ein IEnumerable Ihre Ergebnisse mit zurück.

var paginatedArticles = OrderedArticles.Skip((page ?? 0) * pageSize).Take(pageSize).ToList(); 

return View(paginatedArticles); 

jedoch auf der Grundlage Ihrer Ansicht und die Helfer Klasse, die Sie geschrieben, du bist Ansicht PaginatedList Objekt als Modell erwartet.

Wenn das der Fall ist, würde ich tun, um die folgenden (aktualisiert):

var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize); 

return View(paginatedArticles); 

Und dann sollte Ihre Ansicht nach hat das richtige Modell, um es zurückgeführt wird.

Das sagte: Ich weiß nicht, warum Sie nicht eine Repository-Schicht verwenden, aber wenn Ihre App nur eine einzelne Seite ist, ist es fast immer eine gute Idee, eine an Ort und Stelle zu haben.

aktualisieren ist --here, was ich denke, die volle Steuerung sollte sein:

public ActionResult Index(String query, int? page) 
{ 
    const int pageSize = 4; 

    var ArticleQuery = from m in _db.ArticleSet select m; 

    // Searching 
    if (!string.IsNullOrEmpty(query)) 
    { 
     ArticleQuery = ArticleQuery.Where(m => m.headline.Contains(query)); 
    } 

    var OrderedArticles = ArticleQuery.OrderByDescending(m => m.posted); 

    var paginatedArticles = new PaginatedList(OrderedArticles, page ?? 0, pageSize); 
    // this will now be of type paginatedList. this class handles all of the paging for you, so no need to do that ahead of time 

    return View(paginatedArticles); 
} 

In diesem Fall PaginatedList ist kein Helfer eine voll auf Klasse --its, die erstellt werden muss, und übergeben zu deinem Modell. Ein Helfer in der strikten Definition des Wortes ist sehr unterschiedlich und würde bei Ihnen wahrscheinlich nicht funktionieren.

+0

Hallo. Danke für die Antwort. Ich benutze keine Repos. Was ich brauche, ist, die Helper-Klasse so zu ändern, dass sie mit meinem Controller zusammenarbeitet, wie er ursprünglich für ein Repository geschrieben wurde, das ich in diesem Fall nicht verwende. Könnten Sie mir helfen, es umzuschreiben, um zu arbeiten? Danke vielmals. – Cameron

+0

Auch wenn ich die OrderedArticles nicht übergebe, werden sie nicht mehr bestellt, oder? – Cameron

+0

Nichts, was ich dort gepostet habe, braucht ein Repository, es kann alles direkt in deinen Controller gehen. In diesem Fall übergeben Sie 'OrderedArticles' in den Konstruktor Ihrer' PaginatedList'-Klasse. Es scheint mir, dass dies die Klasse ist, die Sie zu Ihrer Ansicht zurückkehren sollten, damit Sie auf die nächsten/vorherigen Seitenoptionen und so weiter zugreifen können. Ich sehe eine Sache, die ich vermisst habe, ich werde meine Antwort aktualisieren. – TheRightChoyce